3

我有一个看起来像这样的文件:

b, 20, 434
a, 20, 23
a, 10, 123
a, 20, 423
a, 10, 89
b, 20, 88
b, 10, 133
b, 10, 99
  1. 为 col1 和 col2 的每个唯一组合找到 col 3 的最大值。(例如,所有 col3 的最大值a,10
  2. 按 col1 对输出进行分组(所有a行在一起)
  3. 按 col2 对输出进行排序。

也就是说,输出应该是文件应该是

a, 10, 123
a, 20, 423
b, 10, 133
b, 20, 434

如何在 bash 脚本中执行此操作?谢谢你的帮助。

4

2 回答 2

5

这可以完成工作:

< input sort -k3,3gr | sort -k1,1 -k2,2g -u

它在第三个字段上以相反的顺序对数字进行排序,然后对第一个和第二个字段进行排序,仅采用第一次出现(-u 表示唯一)。

您不需要填充,即如果您在输入中添加一行

a, 3, 31

输出是:

a, 3, 31
a, 10, 123
a, 20, 423
b, 10, 133
b, 20, 434
于 2015-12-17T15:14:16.937 回答
2

这会稍微修改空格,但也许这是可以接受的:

awk '$3 > a[$1,$2] { a[$1,$2] = $3 } END {for( k in a) print k a[k]}' input |
    sort -n -t, -k1,1 -k2,2

但是该解决方案高度依赖于输入中的空格,因此最好执行以下操作:

awk '$3 > a[$1","$2] { a[$1","$2] = $3 } 
    END {for( k in a) print k "," a[k]}' FS=, input |
    sort -n -t, -k1,1 -k2,2
于 2013-03-13T22:04:45.057 回答