查找唯一的行

131

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

1
1
2
3
5
5
7
7

我希望的结果是:

2
3

sort file | uniq无法完成任务,它只会显示所有值1次。


22
文件必须首先排序。sort file | uniq -u 将会输出到控制台。 - ma77c
我认为 sort file | uniq 显示所有值仅一次的原因是因为它立即打印第一次遇到的行,对于后续的重复行,它只是跳过它们。 - MrObjectOriented
13个回答

118

uniq 有你需要的选项:

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

58
请确保在执行该命令之前对文件进行了排序,如果文件已经排序,则不需要再次排序。执行命令 "sort file.txt | uniq"。 - user3885927
请参考以下链接中的答案:https://dev59.com/nmYr5IYBdhLWcg3wTYm4#54803217 - hychou

40

使用方法如下:

sort < filea | uniq > fileb

2
这不正确,我想你的意思是:uniq -u filea > fileb - Chris Seymour
1
我复制了你的数据并运行它,它可以正常工作:sort<filea.txt | uniq>fileb.txt。也许你忘记加扩展名了。我使用的是 Mac OS X。你需要从 filea.txt 转到另一个 fileb.txt - kasavbere
1
使用sort时不需要重定向,而将其管道传输到uniq有什么意义呢?当你可以直接使用sort -u file -o file时,你正在删除重复的值,即你的fileb包含1,2,3,5,7,而OP只想要唯一的行,即2,3,这可以通过uniq -u file实现。文件扩展名与此无关,你的答案是错误的。 - Chris Seymour

27

您还可以使用管道将“file”文件的唯一值打印出来,方法是使用cat命令并将其与sortuniq联合使用。

cat file | sort | uniq -u

20

我觉得这更容易。

sort -u input_filename > output_filename

-u 代表唯一。


18

虽然 sort 的时间复杂度为 O(n log(n)),但我更喜欢使用

awk '!seen[$0]++'

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


14

你可以使用:

sort data.txt| uniq -u

对这些数据进行排序并按照唯一值进行筛选


11

uniq -u一直让我很烦恼,因为它不起作用。

所以,如果你有Python(大多数Linux发行版和服务器已经安装了Python):

假设数据文件在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'))

请注意,由于空行的存在,最终结果集可能包含''或仅空格字符串。您可以稍后删除它们,或者直接从终端复制 :)

$ 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

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


7
这太过了。 - ABCD

5
uniq -u < file

会完成任务。


No need for the redirection. - Chris Seymour
是的,我知道。这是我的习惯。 - Shiplu Mokaddim

3
如果您的文件已经排序或可以进行排序,那么使用uniq命令就足够了。如果由于某些原因无法对文件进行排序,您可以使用awk命令:
awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'

3
sort -d "file name" | uniq -u

这对我处理类似问题时有效。如果未排序,请使用此方法。如果已排序,可以删除 sort。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接