【问题标题】:Sort and keep a unique duplicate which has the highest value排序并保留具有最高价值的唯一副本
【发布时间】:2014-04-02 20:35:17
【问题描述】:

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

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

提前谢谢大家

【问题讨论】:

  • sort -r -k1 -k2 -k3 x.txt | awk '{if($i!=l1 &amp;&amp; $2!=l2)print $0; l1=$1; l2=$2;}'
  • 非常聪明的杰瑞,由于排序,我添加了一些东西,我必须指定排序是按数字值,它的结尾是这样的:sort -r -nk1,1 -nk2,2 -nk3,3 | awk '{if($i!=l1 && $2!=l2)print $0; l1=$1; l2=$2;}' 请发布您的解决方案,以便给您一个绿色检查。
  • 勾选其他答案之一。我没有将其发布为答案的原因是因为它依赖于代码,并且从您对 sort 和 uniq 的评论中可以清楚地看出,仅使用标准命令即可完成真正的答案。我将其发布为评论的原因是为了以防万一没有其他人提供答案,以便您得到一些有用的东西。
  • 你能解释一下 awk '{if($i!=l1 && $2!=l2)print $0; l1=$1; l2=$2;}' 有效吗?

标签: sorting unix uniq


【解决方案1】:

这有点好笑,但是:

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 行,但忽略第一个字段(是最后一个字段)
  • 将行反转回原来的顺序
  • 再次将行从低到高排序

可能不是世界上最高效的,但至少每个步骤都有意义。

【讨论】:

  • 我最喜欢这个答案! IT 完全按照他的意愿行事:使用 sort 和 uniq
  • 谢谢JJ。我喜欢你在评论中的方法,但实际上无法让它发挥作用。
  • 只是好奇:为什么你对我的想法有意见? (当我尝试时它对我有用)
  • 很遗憾,uniq -f 是一个不可移植的扩展。
【解决方案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

【讨论】:

  • @beroe,也许你有空格分隔符而不是制表符?上面的命令需要制表符分隔的输入。正如您从我粘贴的输出中看到的那样,它与 OP 正在寻找的内容相匹配。我在 linux 上使用 GNU 排序
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2021-11-08
    • 2019-08-08
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多