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

 みなさん こんにちわ
 まず「お約束」の配列を使ったスクリプトです。全員の各教科の平均点が計算できます

  $1 == "織田信長"{name[1] = $1;
                   kokugo[1] += $2;
                   sansu[1] += $3;
                   rika[1] += $4;
                   syakai[1] += $5;
                   ++kaisu[1];
                   }
  $1 == "豊臣秀吉"{name[2] = $1;
                   kokugo[2] += $2;
                   sansu[2] += $3;
                   rika[2] += $4;
                   syakai[2] += $5;
                   ++kaisu[2];
                   }
  $1 == "徳川家康"{name[3] = $1;
                   kokugo[3] += $2;
                   sansu[3] += $3;
                   rika[3] += $4;
                   syakai[3] += $5;
                   ++kaisu[3];
                   }
  END{for(i=1;i<4;i++){
      printf("%sの国語の平均点は %.2f点です\n",name[i],kokugo[i]/kaisu[i]);
      printf("%sの算数の平均点は %.2f点です\n",name[i],sansu[i]/kaisu[i]);
      printf("%sの理科の平均点は %.2f点です\n",name[i],rika[i]/kaisu[i]);
      printf("%sの社会の平均点は %.2f点です\n",name[i],syakai[i]/kaisu[i]);
      print "";
          }
     }

 結構長いですね^^;。しかし、これで終わりではありません。実はawkの配列では添字に文字列が使えます。name[i]の代わりにname["織田信長"]などとできるのです。これは非常に強力で、それ故「連想配列」というたいそうな名前がついています。

 先のスクリプトを連想配列を使って書き換えてみましょう。

   {
   kokugo[$1] += $2;
   sansu[$1] += $3;
   rika[$1] += $4;
   syakai[$1] += $5;
   ++kaisu[$1];
   }

  END{for(i in kaisu){
      printf("%sの国語の平均点は %.2f点です\n",i,kokugo[i]/kaisu[i]);
      printf("%sの算数の平均点は %.2f点です\n",i,sansu[i]/kaisu[i]);
      printf("%sの理科の平均点は %.2f点です\n",i,rika[i]/kaisu[i]);
      printf("%sの社会の平均点は %.2f点です\n",i,syakai[i]/kaisu[i]);
      print "";
          }
     }

 このスクリプトの詳しい説明は次回とします。
 集計用のスクリプトとしてはかなり応用範囲の広いものですよ。手術台帳の処理で例となった「A先生の悪性症例は***」といった種類の集計などに使えます。



 初出 NIFTY-Serve「みんみんネット」1996/09/27 (Fri) 16:29:50