Let's GAWK! とにかく使うJGAWK その4

 基本統計量の計算にチャレンジします。データファイルは前回のものを使い ます。これは手計算での検算の便宜を考慮してのことです。

織田信長 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