〜2015年4月上旬〜
あれからcrontabでマウスの充電率をデイリーで取っていたわけだけど、
70%のまま変化がないのであった。なんだよ。飾りか。
% awk '{print $NF}' ~/etc/mouse.txt | uniq
70%
こんな便利なモードがあるとは今まで気づかなかった。
使えるようにするにはGuest Additionsか、
もしくはvirtualbox-guest-dkmsパッケージを入れる必要あり。
メニューのビューからシームレスモードへ移行できる。
sedを使えば結構簡単だった。
% echo 'abcdefghijkl' | sed ':;h;s/\(...\).*/\1/p;g;s/.//;t;d' abc bcd cde def efg fgh ghi hij ijk jkl
\(.\{3\}\)と書けばわかりやすいか。
和集合、積集合、差集合はすべてjoinコマンドで可能。
% bi-gram() { echo "$1" | sed ':;h;s/\(.\{2\}\).*/\1/p;g;s/.//;t;d' | sort -u; }
% bi-gram paraparaparadise
ad
ap
ar
di
is
pa
ra
se
% bi-gram paragraph
ag
ap
ar
gr
pa
ph
ra
% join <(bi-gram paraparaparadise) <(bi-gram paragraph)
ap
ar
pa
ra
% join -a1 -a2 <(bi-gram paraparaparadise) <(bi-gram paragraph)
ad
ag
ap
ar
di
gr
is
pa
ph
ra
se
% join -v1 <(bi-gram paraparaparadise) <(bi-gram paragraph)
ad
di
is
se
% bi-gram paraparaparadise|grep se
se
% bi-gram paragraph|grep se
-a1 -a2で和集合、何もつけなければ積集合、-v1で差集合となる。
seが含まれてるかどうかは普通にgrepで。
最近なんかやたらとニコ動とかYouTubeで動画が数秒置きに止まるなあと思って、
また拡張を無効にしまくっていったらuBlockだった。
ABPより軽いはずなのになぜ?
まあ、サイト毎に無効にできるから問題ないんだけど。
xargsにとっては"も'も\も特別な意味を持っていて、シェルと同じように処理され消える。
したがって対応していないとエラーになってしまう。
% echo '"a b" c' | xargs a b c % echo '"a b c' | xargs xargs: ダブルクオートが一致しません。デフォルトでは -O オプションを指定しない限り xargs でクォートは特別な意味を持ちます
man xargsしても-Oなんてオプションはどこにも出てこないからおかしいと思ったら、
実はこのメッセージはバグってて-Oじゃなくて-0が正しい。LANG=Cだと合っている。
% echo '"a b c' | LANG=C xargs xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
きっと判別しづらいフォントを使っている人が書いたんだろう。
そんな話はどうでもよくて、じゃあそのままの文字を渡したければどうすればいいかというと、
やはりシェルと同じで\でクォートしてあげる必要がある。
% echo '\"a b c' | xargs "a b c
ちょっと面倒。あとはメッセージにしたがって、-0とか-dで区切りを指定するしかない。
% echo '"a b c' | xargs -d '\n' "a b c
昨日のはこれの伏線だったわけで、無理矢理bashで解いてみた。
xargs -n1 -d ' ' | while read s; do
if [[ $s =~ ^(.)(.{3,})(.)$ ]]; then
echo "${BASH_REMATCH[1]}"`echo ${BASH_REMATCH[2]} | grep -o . | shuf | paste -sd ""`"${BASH_REMATCH[3]}"
else
echo $s
fi
done | paste -sd ' '
これを09.shと名付け、実行してみる。
% echo "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ." | bash 09.sh I cld'onut blveiee that I cloud atlulcay utneasdnrd what I was rnaeidg : the ponenhmael pweor of the human mind .
このcouldn'tが曲者で-d ' 'を指定しないとエラーになってしまう。
まあ、xargsを使わなくても、tr ' ' '\n'で十分なんだけど。
第2章はUNIXコマンドと同じ挙動をする処理を書けという話で、確認方法も記載されている。
ということはつまりシェル芸的にはそれ以外の方法で実現すると解釈しよう。
行数のカウントはすでに
先月やったのでまた別な方法を考える。
% < hightemp.txt wc -l
24
% < hightemp.txt jq -sR './"\n"|length'
24
% < hightemp.txt ruby -ne 'END{p $.}'
24
% < hightemp.txt perl -nE 'END{say $.}'
24
% < hightemp.txt tr -cd '\n' | uniq -c | tr -cd '0-9\n'
24
sedとtrを封印されたが、awkでもrubyでもperlでもいける。
% ruby -pe 'gsub(/\t/, " ")' hightemp.txt
% awk '{gsub(/\t/, " ")}1' hightemp.txt
% perl -pe 'y/\t/ /' hightemp.txt
ああ、こんな方法もあるな。
% sh -c 'while read a;do echo $a;done' < hightemp.txt % awk '$1=$1' hightemp.txt
joinはかなり無理がある。これぐらいだとなぜかsortしなくてもjoinは文句言わない。
% join -o 1.1,1.2,1.3,1.4 hightemp.txt hightemp.txt
awkだと簡単。
% awk '{print $1 > "col1.txt"; print $2 > "col2.txt"}' hightemp.txt
% cut -f1 hightemp.txt | diff - col1.txt
% cut -f2 hightemp.txt | diff - col2.txt
あとむりやりjoinで。
% join -o 0 hightemp.txt hightemp.txt > col1.txt % join -o 1.2 hightemp.txt hightemp.txt > col2.txt