Easy Awk
初版:2000/12/22,最終更新:2003/6/6,文責:向川康博
はじめに
「awk」は簡単にテキスト加工ができるパターンマッチングスクリプト言語です. 簡単なデータ処理は,いちいちC言語で書くのではなく, スクリプト言語で書きましょう. もちろん sh,perl,rubyなど何を使ってもいいですが, awkもなかなか捨てたもんではありません. 文法がC言語に似ているのでとっつきやすいでしょう.というわけで,チョー簡単な awkの使い方を紹介します. ここで書く以外にもパターンマッチングなど, awkはホントいろんなことができますので, 興味のある人は深くチャレンジしてみて下さい.
最低限の知識
◎ スクリプトの構造
awkスクリプトはこのようになっています.BEGIN{ 前処理 } パターン { アクション } END{ 後処理 }まず「前処理」をします. 次に,テキストの各行のうち, 「パターン」に一致した行に対してだけ「アクション」をします. 最後に「後処理」をします. このうち「前処理」「後処理」「パターン」が必要なければ,シンプルに{ アクション }だけになります.◎ 起動方法
コマンドラインから動かすのであれば,% cat hogehoge | awk 'BEGIN{ 前処理 } パターン { アクション } END{ 後処理 }'あるいは% cat hogehoge | awk '{ アクション }'長ければ,process.awk などというファイルにしておき,% cat hogehoge | awk -f porcess.awk◎ レコードとフィールド
$0 が1行のレコード全体. 各行について,$1 が第1フィールド,$2が第2フィールド… を指します.◎ print文と printf文
変数の表示には好きな方を使えます.print x,y printf("Coordinate = %d,%d\n",x,y)※ printf文はC言語と同じです.
サンプル
2次元座標(X,Y)を格納したファイルがあるとします% cat coordinate 22 33 44 55 58 79◎ X,Y座標を入れ換えたい
% cat coordinate | awk '{print $2,$1}' 33 22 55 44 79 58◎ 0から始まる通し番号を付けたい
% cat coordinate | awk 'BEGIN{num=0}{print num,$1,$2; num++}' 0 22 33 1 44 55 2 58 79※ BEGINで変数 numを初期化してます◎ 2次元座標の重心を求めたい
% cat coordinate | awk 'BEGIN{x=y=num=0}{x+=$1;y+=$2;num++}END{print x/num,y/num}; 41.3333 55.6667※ ENDで最後に表示してます◎ 書式を変えたい
% cat coordinate | awk '{printf("Coordinate=(%d,%d)\n",$1,$2)}' Coordinate=(22,33) Coordinate=(44,55) Coordinate=(58,79)※ C言語と同じですね◎ (0,0)とのユークリッド距離を求めたい
% cat coordinate | awk '{print sqrt($1*$1+$2*$2)}' 39.6611 70.4344 98.0051※ こういう算術関数も揃ってます◎ (0,0)とのユークリッド距離が 80以上の座標だけ抜きだしたい
% cat coordinate | awk '{if (sqrt($1*$1+$2*$2)>80) print $0}' 58 79◎ 全ての座標から重心を引きたい
さすがに長いので hoge.awkというファイルにします.===== ここから ===== BEGIN { gx=0; gy=0; num=0; } { x[num]=$1; y[num]=$2; gx += $1; gy += $2; num++; } END { gx /= num; gy /= num; for (i=0; i<num; i++){ printf("%f %f\n", x[i]-gx, y[i]-gy); } } ===== ここまで =====※ 行末の「;」はなくても構いませんが,つけるとC言語っぽくなりますね. というか,$1,$2以外はほとんどC言語と同じ.% cat coordinate | awk -f hoge.awk -19.333333 -22.666667 2.666667 -0.666667 16.666667 23.333333◎ 他にもいろんなサンプルを追加していきます.しばしお待ち下さい.
: :