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

◎ 他にもいろんなサンプルを追加していきます.しばしお待ち下さい.

	:
	: