rubyをawkのように使うには [プログラミング]
Rubyになれるためには使用機会を増やすことだ、と思い、よく使うawkの代わりにRubyが使えれば良いな、と思いました。
■起動オプション
Rubyの起動オプションによって、awkのような振る舞いにできるようです。
-n 入力ファイルを1行ずつループして読み込む
-a 読み込んだ1行を自動でフィールド分割
■shebang
起動オプションが必要となると、shebangを少し工夫しなければなりません。というのは、例えばawkの場合、
#!/bin/awk -f BEGIN{ 〜 } /hoge/{ 〜 }
という感じで書きますが、Rubyの場合、環境によってインストール場所が違うことを考慮して、
#!/usr/bin/env ruby
と書くことが多いようです。でもshebangでは引数は1つしか使えない環境があるそうなので、rubyのオプションを続けて書くことができません。そこで、
#!/bin/sh exec ruby -S -nax $0 "$@" #! ruby
と書くと良いとのこと。おまじないですな。日常使いなら、使用環境は固定されているから、ここまで凝らずに、
#!/usr/bin/ruby -na
くらいにしておくのが妥当かもしれません。
■awkとの違い
システム変数などは結構違いますが、主なものだけ。rubyの変数名はperlみたいで不気味ですね。「require 'English'」すると、awkと同じ変数名が使えるようになります。
個人的に最大の違いはnext文のふるまい。ちょっと変わったことをする場合にわりとよく使うので。rubyの場合はフラグ変数を使わないと、nextの動きを実現できない気がします。
あとは、awkは変数スコープがグローバルなので、rubyのローカル変数を使っていて変数が見えなくて「あれ?」ということがあります。
項目 | awk | ruby |
フィールドセパレータ | FS | $; |
出力フィールドセパレータ | OFS | $, |
レコードセパレータ | RS | $/ |
出力レコードセパレータ | ORS | $\ |
カレント行番号 | NR | $. |
分割されたフィールド | $1, $2,... | $F[0],$F[1],... |
パターンマッチ | $1 ~ /正規表現/ | if $F[0] =~ /正規表現/ |
BEGINブロック内変数のスコープ | グローバル |
1.8まではBEGINブロック内、
2.0以降はグローバル
|
next文のふるまい |
次の入力行を読み込み、
スクリプトの最初から実行
|
ループを1個抜けるだけ
|
2017-08-19 11:00
nice!(0)
コメント(0)
コメント 0