私は持っています
Sample_A 100
Sample_A 200
Sample_B 300
Sample_B 100
1行の各キーについて、2行の値の平均を印刷したいと思います。
Sample_A 150
Sample_B 200
他の質問に対する優れた答えを使用して、行1の各キーに対して行2の値の合計を印刷できます。 2番目の列に基づいて最初の列の合計を取得します。
コマンドは次のとおりです。
awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt
これは生産します
Sample_A 300
Sample_B 400
ただし、平均を計算するには、次のようにキー発生回数を保存する方法が必要です。
awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt
しかし、私のcount(k)
コードは少し目が遠く動作しません。
答え1
一緒にawk
できること:
awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile
Sample_A 150
Sample_B 200
またはGNUを使用してくださいdatamash
:
datamash -t' ' --sort --group 1 mean 2 <infile
Sample_A 150
Sample_B 200
答え2
$ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input
Sample_A 150
Sample_B 200
平均を導出するには、平均を求めるエンティティの数とその値の合計の2つが必要です。count
前者の場合は配列を使用し、sum
後者の場合は配列を使用します。各配列のキーは、データファイルの最初の列に割り当てられます。
END
次に、データを収集した後、句を使用して各配列を調べ、合計と数を取得し、ある配列を別の配列に分割し、結果を表示します。
スクリプトawk
はもう1行に表示されなくなり、次のように再フォーマットされています。
{
sum[$1] += $2
count[$1] += 1
}
END {
for (key in count) {
print key, sum[key] / count[key]
}
}