さて,同じ目的を達成するためにも,やり方は何通りもある。そこで,今後このスクリプトを発展させていくために別の方法を導入しよう。
#!/usr/local/bin/gawk -f

{
	data[FNR] = $0
}

END {
	for (i = 1; i <= FNR; i++) {
		x += data[i]
	}
	print "N =", FNR
	print "Mean =", x/FNR
}

 まず,今までのスクリプトでは,データファイルから読んだ数値をすぐ利用していた(変数xに加算していた)が, 読み込んだ数値を後の処理のためにとっておくことを考える。
	data[FNR] = $0
の部分が変更された部分である。data[ ]というのは配列(この例の場合は,数学的にいえばベクトルといった方が適切ではあるが)を表す。配列は複数の数値をまとめて取り扱うための機構である。複数の数値は[ ]の中に書かれる「添字」で識別される。[ ]の前にあるのは配列名である。一つの変数を表すのに一つの変数名があったように,配列は配列名で識別される。

 スクリプトでは,FNRが添字として使われている。データファイルの1番目の行が入力されたとき,FNRは1になる。そして,入力された内容はdata[1]に格納される。10番目に入力された内容はdata[10]に格納される。

 入力が終了したとき,配列dataには10個の要素が記憶されている。

 ENDパターンに対応するアクション部分では,配列dataに記憶されている数値を対象として処理することになる。

	for (i = 1; i <= FNR; i++) {
		x += data[i]
	}
の最初の行 for (i = 1; i <= FNR; i++) { for文と呼ばれるものであり,「iを1からはじめて( i = 1 ),1ずつ増やしながら i++ ),iFNRより小さいか等しい限り i <= FNR ),{ }で囲った部分を実行する」という意味である。i++ i = i+1 と同じことを表す。

 繰り返される内容は,x += data[i] である。
 すなわち,このfor文は x = data[1]+data[2]+・・・+data[10] の計算を行っていることになる。


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

E-mail to Shigenobu AOKI