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