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

时间:2014-04-02 20:35:17

标签: sorting unix uniq

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

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

先谢谢你们

3 个答案:

答案 0 :(得分: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行,但忽略第一个字段(是最后一个字段)
  • 将线路反转回原始订单
  • 再次将线条从低到高排序

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

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

答案 2 :(得分:0)

sort -nr myfile.txt | rev | uniq -f1 -f2 -f3 -f4 | rev | sort -n

对于我需要对显示字段 2 和字段 4 的最高值的 4 列进行排序的文件,上述方法非常有效

STORE402        27         8          1          21-04-2021_07:55:01
STORE402        34         8          3          19-04-2021_11:40:01
STORE402        34         8          3          19-04-2021_15:05:01
STORE402        36         8          4          21-04-2021_12:05:01
STORE402        40         8          5          19-04-2021_12:20:01
STORE402        43         8          6          20-04-2021_10:40:01

运行命令后的输出:

STORE402        43         8          6          20-04-2021_10:40:01