2つの列を含むファイルがある場合:
Id ht
510 69
510 67
510 65
510 62
510 59
601 29
601 26
601 21
601 20
同じIDを持つすべての行を平均高さの行にマージする方法が必要です。この例では、(69 + 67 + 65 + 62 + 59)/ 5 = 64および(29 + 26 + 21 + 20)/ 4 = 24なので、出力は次のようになります。
Id Avg.ht
510 64
601 24
sed/awk/perlを使ってこれを行うにはどうすればよいですか?
ベストアンサー1
awkを使う:
入力ファイル
$ cat FILE
Id ht
510 69
510 67
510 65
510 62
510 59
601 29
601 26
601 21
601 20
シェルからawk:
$ awk '
NR>1{
arr[$1] += $2
count[$1] += 1
}
END{
for (a in arr) {
print "id avg " a " = " arr[a] / count[a]
}
}
' FILE
または、シェルでPerlを使用してください。
$ perl -lane '
END {
foreach my $key (keys(%hash)) {
print "id avg $key = " . $hash{$key} / $count{$key};
}
}
if ($. > 1) {
$hash{$F[0]} += $F[1];
$count{$F[0]} += 1;
}
' FILE
出力は次のとおりです
id avg 601 = 24
id avg 510 = 64.4
最後のジョークはPerlの暗く難読化された一行のジョークです =)
perl -lane'END{for(keys(%h)){print"$_:".$h{$_}/$c{$_}}}($.>1)&&do{$h{$F[0]}+=$F[1];$c{$F[0]}++}' FILE