rubyでawk風にワンライナー

awkを使ってよくワンライナーを書くんですが、
ruby とか railsを使っている自分が何故awkなのかというと
rubyでのやり方を知らなかったから。だったりします。


そして、実はできる事をしった。
ruby -n で $_に文字列が格納される。
ruby -p で -nと同様だけど、各行の実行後に$_の結果を表示する。
ruby -e 'SCRIPT'ができるので
ruby -ne 'p $_'で表示できる。


で、splitを自動でするオプションの-a(-n もしくは-pがなければ無効)をすると

echo "a b c" | ruby -ane '$F.each { |value| p value }'

"a"
"b"
"c"

という結果になる。


おお、awkぽい。
ls で /^d/に一致するものだけ出したい時は

ls | ruby -ne ' p $_ if $_ =~ /^d/ '

とする。


毎行rubyを実行しているのか、内部でループして評価しているのかチェックのために

 echo "a b c\nd e" | ruby -ane 'num = 0; $F.each{ |value| p num += 1 } '

1
2
3
1
2

とやる。


んー、てか0で初期化してるしなー。って事で

 echo "a b c\nd e" | ruby -ane 'num ||= 0; $F.each{ |value| p num += 1 } '

1
2
3
4
5

num が2行目の実行時も残っているので、||=*1で初期化されていないぽい。
いいじゃんいいじゃん。


んで、BEGINもあって、
ruby -ane 'BEGIN{ script } script2 '
とかいけるらしい。


これでrubyでもワンライナーいける!

*1:なかった場合に代入する