最初の列が同じ平均行

最初の列が同じ平均行

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

おすすめ記事