〜2014年8月上旬〜
なんか急にruby-talk MLが止まってしまって、
どうなってるのかログを見てもよくわからず、
週末にでもじっくり調べようと思っていたら、
今日になって突然流れてきた。
単に寂れただけ?
他のruby-coreとかは動いていたしなあ。
Q6をzshで。
% printf "5\n3\n4\n10\n2\n" | while read a;do echo ${(l:2:)a} ${(l:a::*:)};done 5 ***** 3 *** 4 **** 10 ********** 2 **
awkで文字を繰り返すにはOFSを使う手もある。
% awk 'BEGIN{NF=5+1; OFS="*"; print}' ***** % printf "5\n3\n4\n10\n2\n" | awk '{printf "%2d ", $1; NF=$1+1; $1=""}OFS="*"' 5 ***** 3 *** 4 **** 10 ********** 2 **
区切りは間にあるのでフィールド数は1つ大きい。
Q2をGNU sedで。
% < kaibun sed 'h;s/.*/echo &|rev/e;x;G;s/\n.//' たけやぶやけた わたしまけましたわ
小問1のほうはzshならこんな方法も。
% echo わたしまけ > >(rev) | sed 'N;s/\n.//' わたしまけましたわ
teeだとfdが違うようでstdoutひとつにはまとまらなくなる。
% echo わたしまけ | tee >(rev) | sed 'N;s/\n.//' けましたわ わたしまけ % (echo わたしまけ | tee >(rev)) | sed 'N;s/\n.//' わたしまけましたわ
Q5をzshで。
% cat input A 31 1234 -42 4 B 10 31.1 -34 94 % < input while read -A a;do echo ${(nO)a};done A 1234 31 4 -42 B 94 31.1 10 -34
本来ならAとBは別に処理して
% < input while read -A a;do echo $a[1] ${(nO)a[2,-1]};done A 1234 31 4 -42 B 94 31.1 10 -34
のようにすべきだが、大きい順だとうまい具合にまとめてソートしても題意と合ってしまう。
numeric sortでも数値よりもアルファベットのほうが大きいらしい。
処理を分けるなら
% < input while read a b;do echo $a ${(s: :nO)b};done A 1234 31 4 -42 B 94 31.1 10 -34
のように数字の部分だけsplitする手もあるかな。
awkで素直に書くとloopになる。
% awk 'BEGIN{for(i=0;i<5;i++)$0=$0"*";print}' *****
結構短い。"%*s"の空白を利用する手もある。
% awk 'BEGIN{$0=sprintf("%*s",5,"");gsub(/./,"*");print}' *****
これはシェルスクリプトでも使われる。
% s=`printf "%*s" 5`;echo "${s// /*}" *****
5バイトならなんでもいいので
% s=`w|head -c5`;echo "${s//?/*}" *****
という手もある。長いときはyesで。
先日は
% awk 'BEGIN{OFS="*";NF=6;print}' *****
と書いたが、
% awk 'BEGIN{$5=OFS="*";print}' *****
のほうが5という数字が出てくるのでわかりやすいかもしれない。短いし。
% printf "5\n3\n4\n10\n2\n" | awk '$1=sprintf("%2d ",$1){$$1=OFS="*"}1' 5 ***** 3 *** 4 **** 10 ********** 2 **
今日はハンコの日なので縦書きに挑戦してみた。
まずは
% printf "たいへん\nよくでき\nました\n" たいへん よくでき ました
をなんとかする。3つの部分を別々に処理しよう。というわけでこんなのを考えた。
% printf "たいへん\nよくでき\nました\n"|tac|xargs -n1 -I% sh -c \ 'echo "%"|grep -o .|convert -pointsize 40 -font 梅明朝-Regular -gravity northeast -stroke red -strokewidth 4 label:@- -trim miff:-' | \ convert - +append tydtyd.png
やってる内容はだいたいこんな感じ。
% alias tate='convert -pointsize 40 -font 梅明朝-Regular -gravity northeast -stroke red -strokewidth 4 label:@- -trim' % printf "た\nい\nへ\nん"|tate taihen.png % printf "よ\nく\nで\nき"|tate yokudeki.png % printf "ま\nし\nた"| tate mashita.png % convert mashita.png yokudeki.png taihen.png +append tydtyd.png
あとは 昨年作ったガワと組み合わせて完成。
% convert tyd.png \( tydtyd.png -resize 50% \) -gravity center -compose multiply +composite -rotate -20 tyd2014-20.png
まあ、普通はこんな感じのdebug文になると思う。
% sh -c 'if [ -n "$debug" ]; then echo foo; fi' % debug=1 sh -c 'if [ -n "$debug" ]; then echo foo; fi' foo
短くするにしても&&を使うぐらい。
でもそれよりもっと簡単に書けることに最近気づいた。
変数展開にいまいち使い途のよくわからない+があるが、
これがぴったりはまる。先の例は
% sh -c '${debug:+echo foo}' % debug=1 sh -c '${debug:+echo foo}' foo
で済んでしまう。debugが設定されていればecho fooに置き換わるので。
${parameter:+word} Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
環境変数さえ設定されていれば値は空でもいいとするなら:+を+にすればいい。
% debug= sh -c '${debug:+echo foo}' % debug= sh -c '${debug+echo foo}' foo
英語ではcommifyというが、ls -lしてもcommaで区切ってくれない。
% ls -l saitama-temp.log -rw-r--r-- 1 eban eban 1871583 2013-09-25 14:55:00 saitama-temp.log
GNU coreutilsのnumfmtを使えばフィールド指定もできるのでピンポイントで変換可能。
% ls -l saitama-temp.log | numfmt --grouping --field=5 -rw-r--r-- 1 eban eban 1,871,583 2013-09-25 14:55:00 saitama-temp.log
GNU coreutilsのいくつかのコマンドはオプション--block-sizeか、
BLOCK_SIZE環境変数で'を指定すると区切ってくれる。
% BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 ls -l saitama-temp.log -rw-r--r-- 1 eban eban 1,871,583 2013-09-25 14:55:00 saitama-temp.log % BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 du saitama-temp.log 1,871,872 saitama-temp.log % BLOCK_SIZE=\'1 LC_NUMERIC=en_US.UTF-8 df . Filesystem 1B-blocks Used Available Use% Mounted on /dev/sda2 1,960,461,266,944 841,254,100,992 1,019,597,889,536 46% /
localeも適切に指定してやる必要がある。
A block size specification preceded by `'' causes output sizes to be displayed with thousands separators. The `LC_NUMERIC' locale specifies the thousands separator and grouping. For example, in an American English locale, `--block-size="'1kB"' would cause a size of 1234000 bytes to be displayed as `1,234'. In the default C locale, there is no thousands separator so a leading `'' has no effect.
columnを使うときれいに整形されるが、数値でも左詰めにしてしまう。
% seq 100 | xargs -n10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 % seq 100 | xargs -n10 | column -t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
むかしからあるがあまり使われないコマンドにscがある。
これを使うと右詰めになる。
% seq 100 | xargs -n10 | psc | sc -W% - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
ただ、今度は文字列も右詰めにしてしまうし、
計算式らしいものはそれなりに評価されてしまう。
% ls -l total 1832 -rw-r--r-- 2 eban eban 1871583 2013-09-25 14:55:00 a.txt -rw-r--r-- 2 eban eban 2880 2014-07-26 09:18:54 foo.txt % ls -l | psc | sc -W% - total 1832 -rw-r--r-- 2 eban eban 1871583 1979 14:55:00 a.txt -rw-r--r-- 2 eban eban 2880 1981 09:18:54 foo.txt
元々スプレッドシートだしねえ。awkで書くか。
scといえば面白い機能があって、簡単にtrasnposeできる。
% seq 100 | xargs -n10 | psc -r | sc -W% - 1 11 21 31 41 51 61 71 81 91 2 12 22 32 42 52 62 72 82 92 3 13 23 33 43 53 63 73 83 93 4 14 24 34 44 54 64 74 84 94 5 15 25 35 45 55 65 75 85 95 6 16 26 36 46 56 66 76 86 96 7 17 27 37 47 57 67 77 87 97 8 18 28 38 48 58 68 78 88 98 9 19 29 39 49 59 69 79 89 99 10 20 30 40 50 60 70 80 90 100
なかなかすごいオプションを発見した。
--swdespeck 0..9 (in steps of 1) [0] Maximum diameter of lone dots to remove from scan.
英語だったのであまりよく見てなかったが、
これは孤立した点のようなノイズを除去してくれるということだな。
早速0と9でどのくらい違うかやってみた。
いやー、これはすばらしい。三点リーダーが完全に消えている。
って消えちゃだめだから真ん中の5ぐらいにしとくか。
あと本当の小さいノイズもちゃんと消えてる。
scanimageでスキャンするとpbmとかpgmになるが、
pngにするよりはそのままgzip *.pbmで圧縮したほうが簡単なので、
最近はpbm.gzだらけになっている。
ふとconvert foo.pbm.gzでひょっとしたらいけるのかと思って試したら全然問題なく処理できた。
このあたりは気が利いてるな。
bzip2でもいけるが、xzはだめのようだ。delegates.xmlに書けばいけるのかもしれないが。