みなさん こんにちわ
では「お約束」の解説です。全部だと長いので、国語の平均点の部分だけ抽出しました。
{ kokugo[$1] += $2; ++kaisu[$1]; } END{for(i in kaisu){ printf("%sの国語の平均点は %.2f点です\n",i,kokugo[i]/kaisu[i]); } }
》 kokugo[$1] += $2;
》 ++kaisu[$1];
ここがこのスクリプトの核心です。kokugo[$1]がいきなり連想配列です。この行を読み込んだときの動作を追跡してみましょう。
織田信長 84 88 80 75
kokugo[$1]は、$1を添字とする配列kokugoを考える、という意味です。よってこの行を処理した時点で、kokugo[$1] --> kokugo["織田信長"]となります。
+= は省略記法でしたね。kokugo[$1] += $2 は kokugo[$1] = kokugo[$1] + $2 と書くのと同じです。配列kokugo[$1]のこれまでの値に$2の値を加えるという意味になります。
以上より、kokugo[$1] += $2 --> kokugo["織田信長"] = 0 + 84 となるわけです。次にこの配列kokugo["織田信長"]の値が更新されるのは織田信長の行を処理する時になります。他の行を処理するときは、この配列はkokugo["豊臣秀吉"]とかkokugo["徳川家康"]になるのです。ここが連想配列の巧みなところです。
連想配列を扱う場合、いくつか常套手段があります。
すべての添字を一巡りするには for(変数 in 配列) というループを使います。当面これ一つおぼえておけばいいでしょう。
END{for(i in kaisu){
printf("%sの国語の平均点は %.2f点です\n",i,kokugo[i]/kaisu[i]);
}
}
こう書くだけで、いちばん最後に、全部の配列について添字と平均の計算結果(点数の合計がkokugo[i]に、iを含むレコード数、つまりテストを受けた回数がkaisu[i]に格納されているのです)が出力できます。
ある文字列が配列の添字になっているかどうかは、「文字列 in 配列」という式の真偽で解ります。このループはその応用です。
初出 NIFTY-Serve「みんみんネット」1996/09/27 (Fri) 19:20:26