ファイルに以下のような内容を作成する。
{
	x += $0
}

END {
	print x/FNR
}

 AWKは,データファイルから行を読み込んで,その内容を処理することを繰り返す。処理内容は「アクション」と呼ばれる。 アクションは { と } で囲んで指示する。

 このスクリプトには2つのアクションがある。最初のものは,

{
	x += $0
}
である。
 入力された行は,$0という変数に格納される。例として使う入力データファイルでは, 最初に「1」という内容が読み込まれるので,その時点で$0は「1」という内容を持つことになる。
	x += $0
というのが,アクションの本体である。
 これは,「変数xの現在の内容に,$0の内容を加算して,その結果を変数xに格納する」ということを表している。 BASICなどのプログラミング言語を知っている人にとっては,
	x = x+$0
という書き方なら分かるであろう。

 ところで,「入力された内容(この場合は「1」)は文字じゃないか?文字を足し算できるのか?」と思った人もいるだろう。
 大抵のプログラム言語では文字と数値は同じではないが,AWKは「必要に応じて,文字としても数値としても使える」ことになっている。

 また,「『変数xの現在の内容に,$0の内容を加算して...』といっても,最初に加算するときの変数xの内容は何なんだ?」と思った人もいるだろう。
 AWKでは,「変数が最初に使われるとき,その内容は空文字である」ことになっている。また空文字が数値として使われるときには0であると解釈される。

 さて,1行目を読み込んだときに取られるアクションは分かったとして,「2行目以降はどのように処理されるのだろうか?」
 AWKは入力データが無くなるまで次々とデータを読んではアクションを実行するということを繰り返す。

 入力ファイルを読み終えた直後の,変数xの内容はデータファイルの中にあった数値の合計になっている。 例として使う入力データファイルを処理した場合には,x=55ということである。

 さて,先ほど,このスクリプトにはアクションが2つあると言った。2つめのアクションは,

END {
	print x/FNR
}
である。
 アクションをくくる{ }の前に,ENDというのが付いているのは, 「このアクションはデータを読み終えた後に1回だけ実行される」ということを示している。 ちなみに,ENDは「パターン」と呼ばれるものの一つである。

 ENDパターンに対応するアクションは,

	print x/FNR
である。
 素直に眺めると,「xをFNRで割った答えをプリントする」と読めるであろうか?
 xは変数xのことであるが,FNRとは何?
 FNRAWKが持っている組込み変数で,その時点でデータファイルから読み込んだ行数を表している。 ENDパターンに対応するアクションが実行されるとき,データファイルからは10行読まれているので,FNR=10ということになる。
 x=55なので,プリントされるのは5.5ということになる。
 ちなみに,答えは紙にプリントされるわけではなく,通常はモニターに表示される。

 さて,スクリプトの実際の内容は分かったとして,これをどのようにコンピュータで実行させるのだろうか?


●前へ戻る   ●次へ進む
Last modified: May 15, 2002

E-mail to Shigenobu AOKI