Awkことはじめ

written by がいすと

2 一行の中にある世界

なんで1行でこの処理が書けてしまうのでしょうか?

これを説明するにはawkというプログラム言語の性格を考えることが必要です。テキストを扱うためには、「テキストファイルを開く」「閉じる」といった操作は、必ずやらなければなりません。Awkは、テキストを項目ごとに扱うために特化しているため、必ずやる操作は暗黙の了解になっているので、書く必要がないようになっています。

Awkでは、ほかにも色々な操作が省略、もしくは簡単になっています。たとえば、{}で囲まれた部分は、「1行読み込んで、データを項目ごとに分け、それについて処理しろ」という意味になっています。

前ページの表の1行目を考えてみましょう。1行目は、A 800 1となっています。Awkはこの行を読み込み、スペースを区切りにして項に分けます。すなわち、第1項がA、第2項が800、第3項が1です。

それぞれの項は$1,$2,$3という名前の変数に格納されます。すなわち、第i項の内容は格納$iに格納されます。さらに、行の内容全体は格納$0に格納されます。

以上より、1行目を読み込んだときの変数の状況は、


$0="A  800  1", $1 = "A", $2 = 800 $3 = 1

となります。

先ほどのプログラムに目を戻しましょう。例のプログラムは、


{print $1,$2*$3}

でした。Print文は以下に続く部分を印刷する命令です。カンマで区切られた項目は、スペースで区切られて出力され、最後は改行されます。つまり、新しい表が出力されます。また、*はかけ算を表します。結局、この文は、「第1項、及び第2項と第3項の積を出力せよ」という動作を表している、ということになります。