【问题标题】:Unix command "uniq" & "sort"Unix 命令“uniq”和“sort”
【发布时间】:2012-10-01 14:40:36
【问题描述】:

众所周知

uniq [options] [file1 [file2]]

它从已排序的 file1 中删除重复的相邻行。选项 -c 打印每一行一次,计算每一行的实例。所以如果我们有以下结果:

     34 Operating System
    254 Data Structure
      5 Crypo
     21 C++
   1435 C Language
    589 Java 1.6

然后我们使用“sort -1knr”对上面的数据进行排序,结果如下:

   1435 C Language
    589 Java 1.6
    254 Data Structure
     34 Operating System
     21 C++
      5 Crypo

谁能帮我看看如何按这个顺序只输出书名(没有数字)?

【问题讨论】:

  • cut 是神奇的词(其中之一)。
  • 我觉得不行,因为数字前面有几个空格,你怎么识别字段?使用“cut -d''-f 2”?它不会返回任何内容
  • 例如“cut -c 9-”,它会忽略数字,但我们必须知道count列的确切字符数
  • 是的,我们需要知道宽度才能使用cut。
  • 你的意思是-k1nr,不是-1knr,对吧?另外,感谢有用的命令!

标签: linux sorting unix command uniq


【解决方案1】:
uniq -c filename | sort -k 1nr | awk '{$1='';print}'

【讨论】:

  • 不使用“awk”命令怎么办?只使用“uniq”、“sort”、“tr”、“wc”、“head”、“tail”
  • 您已经在对 Michael Krelin 的评论中解释了为什么 cut 不好。您可以使用-c 选项,但我不想依赖计数列中的确切字符数。
  • cut 不好,但这是最简单的方法。我觉得这个解决方案很好,工具也很合适。当然,您可以使用 while 和 read 做一些事情,但实际上,awk 正是完成任务的正确工具。
【解决方案2】:

你也可以使用sed,如下:

uniq -c filename | sort -k -1nr | sed 's/[0-9]\+ \(.\+\)/\1/g'

测试:

echo "34 Data Structure" | sed 's/[0-9]\+ \(.\+\)/\1/g'
Data Structure

这也可以通过简化的正则表达式来完成(由 William Pursell 提供):

echo "34 Data Structure" | sed 's/[0-9]* *//'
Data Structure

【讨论】:

  • 这可以大大简化:sed 's/[0-9]* *//g'
  • 确实!,虽然您发布的那个(带 *)在我的测试中不起作用,但它与 + 一起使用,我将其添加到我的答案中,谢谢 :-)
  • 您不能在简化版本中使用g 标志。那将获得诸如“海底20000个联赛”之类的标题。 (我的错误包括它;肌肉记忆很难消失。)
【解决方案3】:

为什么你使用uniq -c 来打印出现次数,然后你想通过一些 cut/awk/sed 舞蹈来删除它?

相反,您可以使用

sort -u $file1 $file2 /path/to/more_files_to_glob*

或者某些系统是否带有不支持-u 的sort 版本?

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多