105

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

1
1
2
3
5
5
7
7

我希望结果是:

2
3

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

4

11 回答 11

99

uniq有您需要的选项:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
于 2012-12-08T14:25:25.973 回答
33

使用如下:

sort < filea | uniq > fileb
于 2012-12-08T14:25:53.977 回答
21

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

cat file | sort | uniq -u

于 2019-03-15T20:16:27.927 回答
13

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

awk '!seen[$0]++'

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

于 2019-02-21T09:12:30.730 回答
11

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' 不会检测重复的行,除非它们是相邻的。您可能希望先对输入进行排序,或者在不使用 'uniq' 的情况下使用 'sort -u'。此外,比较遵循 'LC_COLLATE' 指定的规则。”

调用的正确方法之一是:# sort nonUnique.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

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

于 2016-01-21T05:23:54.277 回答
8

您可以使用:

sort data.txt| uniq -u

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

于 2019-04-21T15:23:34.757 回答
5

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

于 2012-12-08T14:17:57.870 回答
5

我觉得这更容易。

sort -u input_filename > output_filename

-u代表独特。

于 2020-09-08T07:35:08.243 回答
3

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

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

于 2016-04-19T18:03:28.750 回答
3
sort -d "file name" | uniq -u

这对我来说是类似的。如果没有安排,请使用它。如果已排列,您可以删除排序

于 2018-04-04T19:00:01.203 回答
0

这是我第一次尝试

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 $

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

谢谢你

于 2012-12-09T12:41:32.077 回答