我有
Sample_A 100
Sample_A 200
Sample_B 300
Sample_B 100
我想打印第 1 行中每个键的第 2 行中值的平均值
Sample_A 150
Sample_B 200
我可以使用另一个问题的优秀答案打印第 1 行中每个键的第 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
或者使用GNUdatamash
:
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
要得出平均值,您需要两件事:被平均的实体数量的计数以及这些值的总和。count
对于前者,我们使用一个数组,sum
对于后者,我们使用一个数组。每个数组中的键都分配给数据文件中的第一列。
END
然后,在收集数据后,我们使用一个子句来查看每个数组以获取总和和计数,将一个数组除以另一个数组,然后显示结果。
该awk
脚本经过重新格式化,不再全部在一行上,如下所示:
{
sum[$1] += $2
count[$1] += 1
}
END {
for (key in count) {
print key, sum[key] / count[key]
}
}