SSブログ

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個抜けるだけ

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

rubyでバイナリファイルを読んでみる|- ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。