排序并保留具有最高值的唯一副本

问题描述 投票:1回答:2

我有一个如下所示的文件,我想保留第三个字段上具有最高值的第一个和第二个字段之间的组合(带箭头的那些,箭头不包括在实际文件中)。

1   1   10
1   1   12        <- 
1   2   6         <-
1   3   4         <- 
2   4   32
2   4   37
2   4   39
2   4   40        <- 
2   45  12
2   45  15        <- 
3   3   12
3   3   15
3   3   17
3   3   19        <- 
3   15  4
3   15  9         <- 
4   17  25
4   17  28
4   17  32
4   17  36        <- 
4   18  4         <- 

为了拥有和输出这样:

1   1   12
1   2   6
1   3   4
2   4   40
2   45  15
3   3   19
3   15  9
4   17  36
4   18  4

我想也许我只是玩sortuniq命令,但我弄得一团糟。

有任何想法吗?

非常重要的注意事项:条目从一开始就没有整齐排序,我只使用了sort -k1,1 -k2,2 -k3,3

先谢谢你们

sorting unix uniq
2个回答
2
投票

这有点好笑,但是:

sort -nr myfile.txt | rev | uniq -f1 | rev | sort -n

输出:

1   1   12
1   2   6 
1   3   4 
2   4   40
2   45  15
3   15  9 
3   3   19
4   17  36
4   18  4 

这个怎么运作:

  • 以数字方式反向排序,将最高值置于顶部(以便保存)
  • 反转每一行,所以最后一个字段是第一个(uniq需要)
  • 仅保存第一个uniq行,但忽略第一个字段(是最后一个字段)
  • 将线路反转回原始订单
  • 再次将线从低到高排序

可能不是世界上效率最高的,但至少每一步都有道理。


2
投票

sort的两次通过应该这样做,例如在bash shell

sort -k1,1n -k2,2n -k3,3nr -t$'\t'  file  | sort -k1,1n -k2,2n -t$'\t' -u -s
1       1       12
1       2       6
1       3       4
2       4       40
2       45      15
3       3       19
3       15      9
4       17      36
4       18      4
© www.soinside.com 2019 - 2024. All rights reserved.