在bash(可能是awk?)中,我如何总结/聚合表(如下所示)以获得每个组的平均值?
grp1 1
grp1 3
grp2 5
grp2 8
grp4 9
在awk
:
awk '{sum[$1]+=$2; count[$1]++} END {for(key in sum) print key ": " sum[key]/count[key]}' input_file
示例文件的输出:
grp1: 2
grp2: 6.5
grp4: 9
解释:
{sum[$1]+=$2; count[$1]++}
:对于输入文件的每一行,我们使用2个关联数组count
,存储第一个字段遇到的时间数sum
,存储此特定组 的第二个字段的每个值的总和
END {for(key in sum) print key ": " sum[key]/count[key]}
:当你的文件完成解析时,我们打印每个组,以及该组的sum/count
给定:
cat file
grp1 1
grp1 3
grp2 5
grp2 8
grp4 9
awk '{d[$1]+=$2; cnt[$1]++} END{for (e in d) print e, d[e] / cnt[e]}' file
打印:
grp1 2
grp2 6.5
grp4 9
如果您希望它们都是浮点表示:
awk '{d[$1]+=$2; cnt[$1]++} END{for (e in d) printf("%s %0.2fn", e, d[e] / cnt[e])}'
打印:
grp1 2.00
grp2 6.50
grp4 9.00
知道awk中的关联数组不保持顺序,所以grpX
可能会从文件中找到的顺序改变。