2013年4月30日火曜日

awkのgetline活用例

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 件のコメント:

コメントを投稿