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

 みなさん こんにちわ
 では「お約束」の解説です。全部だと長いので、国語の平均点の部分だけ抽出しました。

   {
   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