【问题标题】:Find unique lines寻找独特的线条
【发布时间】:2012-11-26 12:40:00
【问题描述】:

如何找到唯一的行并从文件中删除所有重复项? 我的输入文件是

1
1
2
3
5
5
7
7

我希望结果是:

2
3

sort file | uniq 不会做这项工作。将显示所有值 1 次

【问题讨论】:

  • 文件必须先排序。 sort file | uniq -u 将为您输出到控制台。
  • 我认为sort file | uniq 显示所有值 1 次的原因是因为它会立即打印第一次遇到的行,而对于随后的遇到,它只是跳过它们。

标签: linux sorting unique uniq


【解决方案1】:

uniq -u < file 将完成这项工作。

【讨论】:

  • 不需要重定向。
  • 是的,我知道。习惯性的吗
【解决方案2】:

uniq 有您需要的选项:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

【讨论】:

【解决方案3】:

如下使用:

sort < filea | uniq > fileb

【讨论】:

  • 这不正确,我想你的意思是:uniq -u filea &gt; fileb
  • 我复制您的数据并运行它,它可以工作:sort&lt;filea.txt | uniq&gt;fileb.txt。也许你遗漏了扩展。我使用的是 Mac OS X。你必须从 filea.txt 转到其他一些 fileb.txt
  • 没有必要使用sort 进行重定向,而当您可以执行uniq 时,您正在做的是删除重复值,即您的@ 987654329@ 包含1,2,3,5,7 OP 只想要唯一的行,即2,3 并由uniq -u file 实现,文件扩展名与它无关,你的答案是错误的。
【解决方案4】:

这是我第一次尝试

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

在做了 cat -e all.sorted 之后

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

每第二行都有一个尾随空格:( 删除所有尾随空格后它起作用了!

谢谢

【讨论】:

    【解决方案5】:

    uniq -u 一直让我发疯,因为它不起作用。

    所以,如果你有 python(大多数 Linux 发行版和服务器已经有它):

    假设你在 notUnique.txt 中有数据文件

    #Python
    #Assuming file has data on different lines
    #Otherwise fix split() accordingly.
    
    uniqueData = []
    fileData = open('notUnique.txt').read().split('\n')
    
    for i in fileData:
      if i.strip()!='':
        uniqueData.append(i)
    
    print uniqueData
    
    ###Another option (less keystrokes):
    set(open('notUnique.txt').read().split('\n'))
    

    请注意,由于空行,最终集合可能包含 '' 或仅包含空格的字符串。您可以稍后将其删除。或者干脆从终端复制;)

    #

    仅供参考,来自 uniq 手册页:

    "注意:'uniq' 不会检测重复的行,除非它们是相邻的。您可能希望首先对输入进行排序,或者使用 'sort -u' 而不使用 'uniq'。此外,比较遵循由 'LC_COLLATE 指定的规则'。”

    调用的正确方法之一是: # 排序非唯一.txt |独特的

    示例运行:

    $ cat x
    3
    1
    2
    2
    2
    3
    1
    3
    
    $ uniq x
    3
    1
    2
    3
    1
    3
    
    $ uniq -u x
    3
    1
    3
    1
    3
    
    $ sort x | uniq
    1
    2
    3
    

    可能会打印空格,请做好准备!

    【讨论】:

    • 这太过分了。
    【解决方案6】:

    uniq 应该没问题,如果你的文件是/可以排序的,如果你因为某种原因不能对文件排序,你可以使用awk

    awk '{a[$0]++}END{for(i in a)if(a[i]&lt;2)print i}'

    【讨论】:

      【解决方案7】:
      sort -d "file name" | uniq -u
      

      这对我来说也适用于类似的情况。如果没有安排,请使用它。 如果排列好,可以去掉排序

      【讨论】:

        【解决方案8】:

        虽然sort 需要 O(n log(n)) 时间,但我更喜欢使用

        awk '!seen[$0]++'
        

        awk '!seen[$0]++'awk '!seen[$0]++ {print}' 的缩写,如果seen[$0] 不为零,则打印行(=$0)。 它需要更多空间,但只需要 O(n) 时间。

        【讨论】:

          【解决方案9】:

          您还可以使用cat 命令通过管道连接到sortuniq,打印出“文件”中的唯一值

          cat file | sort | uniq -u

          【讨论】:

            【解决方案10】:

            你可以使用:

            sort data.txt| uniq -u
            

            对数据进行排序并按唯一值过滤

            【讨论】:

              【解决方案11】:

              我觉得这更容易。

              sort -u input_filename > output_filename
              

              -u 代表唯一性。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-08-17
                • 1970-01-01
                • 1970-01-01
                • 2021-11-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多