AWK Script に引数を取らせたい
AWK を使いこなすようになってくると、
いつでも使える AWK Script は適当な場所に保存しておきたくなります。
そうなると、より汎用性のあるように書きたくもなるというものでしょう。
ここでは、引数を取らせることによって汎用性を飛躍的に向上させる
ための技を伝授しましょう。引数を取れるようになることのメリットについては
C言語編の
実行ファイルに引数を取らせたい
を参照してください。
さて、伝授といってもそう難しいことは何もありません。
また、平均と分散を計算する AWK Script を考えますが、
今度は第何列の平均と分散を計算するかを引数で渡せるように
します。次のようにすれば一撃です。
まず、AWK Script を次のように書き換えます。
----------------------------------
BEGIN{
ave=0
dev=0
}
$0!~/#/{
n++
#######################################################
# ここがポイント
#######################################################
data[n] = $col # 第 $col 列のデータを取り込む
}
END{
# 平均の計算
for(m=1; m<=n; m++)
ave = ave + data[m]
ave = ave / n
# 分散の計算
for(m=1; m<=n; m++)
dev = dev + (data[m]-ave)*(data[m]-ave)
dev = dev / (n-1)
# 結果の出力
printf("average=%f deviation=%f\n",ave,dev)
}
----------------------------------
このスクリプトの中では、col という値が定義されてないので、
$col は何行目かはまだわかりません。
このスクリプトファイルの名前を avedev.awk とでもし、
噛ませるデータファイルの名前を data とすると、
awk を実行するときに、
----------------------------------
prompt> awk -f avedev.awk -v col=1 data
----------------------------------
とすれば col に 1 が代入され、1列目の平均と分散が計算されます。
当然、2列目があれば
----------------------------------
prompt> awk -f avedev.awk -v col=2 data
----------------------------------
によって1列目の平均と分散が計算されます。