awkを使用して統計データの集計を行う際、別の情報ソースと紐付けて処理を行いたい場合には、getlineを活用出来るケースがある。
例えば、1列目が生徒名、2列目が各生徒の点数から成る以下のようなデータ#1と、
Taro|90
Ziro|92
Saburo|84
Hanako|93
Kaoru|85
Yoko|91
1列目が生徒名、2列目が各生徒のクラス名から成る以下のような別のデータ#2が存在し、
Taro|A
Ziro|B
Saburo|A
Hanako|A
Kaoru|B
Yoko|B
これらのデータからクラス毎の平均点を算出したい場合、以下のスクリプトにより算出が可能となる。
~~~~~~~~
#!/bin/bash
# データ#1の読み込み
tensu=/home/tensu.txt
# データ#2の読み込み
classdb=/home/class.txt
awk 'BEGIN{
FS="|"; Delimiter="|";
cdb="'$classdb'";
while ((getline < cdb) > 0) {
member=1; class[$member]=$2;
}
close(cdb);
}{
total[class[$1]]+=$2;
count[class[$1]]++;
} END{
for (r in count) {
printf("%s%s%.2f\n", r, Delimiter, total[r]/count[r]);
}
}' ${tensu}
~~~~~~~~
算出結果:
A|89.00
B|89.33
0 件のコメント:
コメントを投稿