【问题标题】:How to sort and display only first occurrence of every unique lines in unix?如何排序和显示unix中每个唯一行的第一次出现?
【发布时间】:2021-03-15 09:32:17
【问题描述】:

如何在 unix 中仅排序和显示每个唯一行的第一次出现?

例如, 文件包含:

abcd 5

abcd 2

abcd 10

xyz 1

xyz 4

xyz 5

需要的输出:

abcd 10

xyz 5

编辑: 我在第 1 列中有多次 abcd 和 xyz,在第 2 列中有不同的值。我需要的只是 sort -nk2 | abcd & xyz 的 head -1 或文件中 column1 中的任何内容。

找到了一种方法来解决这个问题,但任何人都可以使用更好的解决方案进行更新。 我可以执行 awk column1,将 -u 排序到文件中,然后 grep 唯一排序的 column1 内容并执行排序 -nk2 | head -1 得到预期的结果。

谢谢,

马克

【问题讨论】:

  • 你尝试排序 file.log |唯一的-u?如果文件包含行(不是您的示例中的空格分隔的单词),这应该可以工作。顺便说一句,您提供的“需要的输出”不是默认的字母数字排序。如果您实际上有空格分隔的项目或想要自定义排序,这将使命令复杂化。还是一行两个字?考虑改进样本输入和输出。
  • @mak - 你的问题是荒谬的。 唯一行的出现是第一次,最后一次,唯一的出现。
  • @armali 如果我的解释不清楚,请按照输入和所需输出示例进行操作。我在第 1 列中有多次 abcd 和 xyz,在第 2 列中有不同的值。我需要的只是 sort -nk2 | abcd & xyz 的头 -1 或文件中的 n 行。
  • 很抱歉,如果您懒得纠正您问题中的不一致(不仅仅是歧义),我不打算寻找答案。

标签: unix


【解决方案1】:

使用 GNU awk:

awk '{ map[$1][$2]=1 } END { PROCINFO["sorted_in"]="@ind_num_asc";for (i in map) { for (j in map[i]) { } print i " "j } }' file

解释:

awk '{ 
       map[$1][$2]=""                                  # Create a 2 dimensional array with the first space separated field as the first index and the second field the second index
     } 
 END {                                                 # Process at the end of the file
       PROCINFO["sorted_in"]="@ind_num_asc";           # Set the array ordering Iindex ascending)
       for (i in map) { 
         for (j in map[i]) { 
         } 
         print i " "j                                  # Loop through the array printing the result
       } 
      }' file

【讨论】:

  • 嗨拉曼,感谢您的努力。我发现您的脚本存在语法问题。纠正了一个问题,但无法解决其他问题。
  • 您使用的是什么版本的 awk。这适用于 GNU awk 4.2
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2017-09-09
  • 2020-01-03
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多