bash脚本:查找max,group by和按列排序

时间:2013-03-13 21:51:17

标签: bash shell

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

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的最大值。 (例如,所有a,10的col3的最大值)
  2. 按col1(所有a行组合)
  3. 对输出进行分组
  4. 按col2对输出进行排序。
  5. 也就是说,输出应该是 文件应该是

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这就是工作:

< 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