1

我有一个格式的 xyz 矩阵:

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 的知识,我非常感谢任何人可以提供的任何帮助。

提前致谢。

4

1 回答 1

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并使用 GNUawk扩展功能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
于 2013-08-18T04:15:09.520 回答