Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

ruby - ワンライナーの書き方入門 ane,apeだけで大体いける

なんか流行ってるみたいなのでいつも使うものを数点あげてみます。
rubyワンライナーするときには-aneと-apeだけおぼえれば大体いける。
日本生まれだけあって日本語はほとんど気にしなくてOK


データは以下

$ cat > d.txt
1 ひとつめ foo
2 二つ bar
3 3っつめ buzz

真ん中のカラムのみを抜く

$ cat d.txt | ruby -ane 'puts $F[1]'
ひとつめ
二つ
3っつめ

真ん中のカラムを一つのレコードへ

$ cat d.txt | ruby -ane 'print $F[1]," "';echo
ひとつめ 二つ 3っつめ
$ cat d.txt | ruby -ane 'print $F[1],","';echo
ひとつめ,二つ,3っつめ,

最終カラムのみ抜き出す

$ cat d.txt | ruby -ane 'puts $F[2]'
foo
bar
buzz

最終カラムの文字列長のみを出力

$ cat d.txt | ruby -ane 'puts $F[2].size'
3
3
4

最終カラムを文字列長へ置換

$ cat d.txt | ruby -ane 'puts [$F[0],$F[1],$F[2].size].join(" ")'
1 ひとつめ 3
2 二つ 3
3 3っつめ 4

最終カラムを逆転させる

$ cat d.txt | ruby -ane 'puts [$F[0],$F[1],$F[2].reverse].join(" ")'
1 ひとつめ oof
2 二つ rab
3 3っつめ zzub

先頭行と最終行で余計なことをする

$ cat d.txt | ruby -ane 'BEGIN{puts "*さいしょ"};END{puts "*終わり"}; puts $F[1]'
*さいしょ
ひとつめ
二つ
3っつめ
*終わり

1番目のカラムの値を足し算する

rubyの場合、大域変数でこれを行う。$を付けると大域変数
BEGINが必要な分 perlの方がこの点では優れている。

$ cat d.txt | ruby -ane 'BEGIN{$a=0};$a+=$F[0].to_i;END{puts $a}'
6

このように現時点ではrubyperlにはワンライナーでは大して差がありません。
逆に後ろからメソッドがおける点で追記が楽な時があります。
性能面での言及はあえてしない。

日本語の処理を考えるとawkは確実に不要になります。
あ、ape書き忘れた。まあいいか。