基本統計量の計算にチャレンジします。データファイルは前回のものを使い
ます。これは手計算での検算の便宜を考慮してのことです。
織田信長 84 88 80 75 豊臣秀吉 63 66 60 78 徳川家康 80 78 70 90
まず国語と算数の平均点を計算します。
今回はスクリプトが長めなのでファイルにした方がいいでしょう。JGAWK InterFaceはスクリプトファイルを登録できますから便利です。以下の内容の
テキストファイルをつくって「script」のところにファイルとして登録して
ください。
{kokugo = kokugo + $2;
sansu = sansu + $3}
END{printf("国語の平均点 %.2f \n",kokugo/NR)
printf("算数の平均点 %.2f \n",sansu/NR)}
いくつか新しいことがでてきました。
kokugo = kokugo + $2
数学では考えられないような書き方ですが、= はイコールではなくて代入を
意味するものですから、これはごく普通の書き方です。変数 kokugo には、1
行読まれるごとに第2フィールドの数字が加えられていくという意味です。も
っと短く kokugo += $2 とも書けます。
ENDは最後に一回だけという意味のパターンです。END以下のアクションは最
後に一度だけ実行されます。これに対応してはじめに一回だけの BEGINという
パターンもあります。
printfは書式の指定できるprintで、Cでお馴染みの関数です。%.2f の部分
が書式の指定で、浮動小数点数を小数点以下2桁まで表示という意味です。詳
細はまた後日。
NR は awkが内部に持っている変数(組み込み変数)で、読み込んだレコー
ド数(Number of Record)が記録されます。
したがって動作原理は以下のごとし。
変数kokugo には1行読まれるごとに $2の数字が加えられてゆき、全部読み終わるときには $2の合計が記録されている。これを読み込んだレコード数で割れば(kokugo/NR)平均が求められる。出力はこんな感じです。小数点以下は2桁表示になります。
国語の平均点 75.67 算数の平均点 77.33
同様にして標準偏差も計算できます。分散 = 2乗平均 − 平均の2乗 の公式を使っています。sqrt(x)はxの平均を求める関数、x^2は xの2乗です。
{kokugo = kokugo + $2;
sansu = sansu + $3}
{kokugo2 = kokugo2 + $2 * $2;
sansu2 = sansu2 + $3 * $3}
END{printf("国語の標準偏差 %.2f \n",sqrt(kokugo2/NR - (kokugo/NR)^2));
printf("算数の標準偏差 %.2f \n",sqrt(sansu2/NR - (sansu/NR)^2))}
結構面倒に見えるかもしれませんが、一度作っておけばあとは使い回しがき
きますからそうでもありません。
こういうきれいなデータの場合、123、Excelなどのスプレッドシートの方が
もちろん簡単に処理できます(重さは度外視するとして)。awkが真価を発揮
するのは、ある特定のパターンに合うものだけを選択的に集計したい場合など
の「きたないデータ」の処理です。
次回はもう少し複雑な集計にチャレンジします。
初出 NIFTY-Serve「みんみんネット」1996/09/07 (Sat) 01:42:53