鳳鳴は祖父の俳号

日記 メモ そんなの

なぜawkを使うのか

 UNIX文化とC言語の記述に慣れた人がチョイチョイと書くのに最適。

  • C言語似の文法
  • 変数は宣言なしで使えるが、関数(function)内でローカル変数も使用可
  • 連想配列
  • アクションとパターンによるテキスト処理への特化
  • 正規表現

 UNIXのコマンドはテキストに対する処理がたくさんあり、それらをシェル上でパイプなどを使って組み合わせて使うのが流儀だが、ちょっと変わったことをしたい、シェルスクリプトの範囲を越えるようなことをしたいのだがC言語などで書くのは大げさ、という場合にawkは便利に使える。
 文法はC言語に似ているが、変数の使用や関数の戻り値などに宣言がいらない。基本的にグローバル変数となるが、関数内で使用しない引数を用意することにより、ローカル変数として利用できる。
例:


function foo(x,y ,i,a) {
for( i=0 ; i<= ... # iはfoo()内でのみ有効
...
return a ;
}
 また、連想配列が使えるので、ある名前の単語が何回現れたなど簡単に数えて取り出すことができる。ちょっとしたデータベースである。
 awkは入力した行がどのようにマッチするかをパターンで調べ、対応するパターンに対する処理をアクションとして書く。このようにテキスト入力をストリームとして扱うよう枠組みが提供されているので、それに従って書くだけ。また、ストリーム処理が基本のためPerlのようなものと違いメモリをパンクさせることもない。
 正規表現grepsedでおなじみ。前述のパターンとしても使える。また、文字列処理にも適用できるため(sub/gsub/match)、強力。

 巨大化したソフトウェア・ツール(CADなど)のデータを別のツールに引き渡す時には変換が必要だったりするが、テキストデータで吐き出してくれればawkで加工できる。ツールの出力は定型化されているので、構文解析を真面目にやらなくても正規表現で簡単に済ませられる場合が多い。ソフトウェア・ツール間のgrueとして使用できる。
 また、「前日の検証結果と本日の検証結果から違っている部分を抜き出したい、具体的には一行のうちでX→Nに変わっている文字」「CADの座標(X,Y)をすべて1.25倍に拡大したい」「回路の信号名のうちまったく使われなくなったものを抜き出したい」といった要望に対して30分〜1時間くらいで結果が出せるのだ。こんなに便利な道具はない。

 そんなわけでawk使えawk

書籍:これだけで充分ですよ。最初に入門する言語がawkでもいいくらいアルゴリズムについて丁寧に書いてあります。
http://cs.bell-labs.com/cm/cs/awkbook/index.html