我有一个格式为x y z的矩阵:
1 1 0.02
1 2 0.10
1 4 0.22
2 1 0.70
2 2 0.22
3 2 0.44
3 3 0.42
......等等。我有兴趣对特定x值(第1列)的所有z值(第3列)求和并在单独的行上打印输出(使用x值作为前缀),这样前一个例子的输出就会显示为:
1 0.34
2 0.92
3 0.86
我强烈认为awk是正确的工具,但是awk的知识确实缺乏,我真的很感激任何人都可以提供的任何帮助。
提前致谢。
答案 0 :(得分:3)
我同意awk
是这项工作的好工具 - 这正是它的设计任务。
awk '{ sum[$1] += $3 } END { for (i in sum) print i, sum[i] }' data
对于给定的数据,我得到了:
2 0.92
3 0.86
1 0.34
显然,您可以将输出传输到sort -n
,然后按排序顺序获取结果。
要使用awk
按排序顺序获取,您必须超出POSIX awk
的范围并使用GNU awk
扩展函数asorti
:
gawk '{ sum[$1] += $3 }
END { n = asorti(sum, map); for (i = 1; i <= n; i++) print map[i], sum[map[i]] }' data
输出:
1 0.34
2 0.92
3 0.86