Macで使う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