寻找独特的线条


89

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

1
1
2
3
5
5
7
7

我希望结果是:

2
3

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


17
该文件必须先排序。sort file | uniq -u将为您输出到控制台。
ma77c

我认为原因sort file | uniq是一次显示所有值是因为它会立即打印第一次遇到的行,而对于随后的遇到,它只会跳过它们。
Reeshabh Ranjan

Answers:



28

用法如下:

sort < filea | uniq > fileb

2
这是不正确的,我认为您的意思是:uniq -u filea > fileb
克里斯·西摩

1
我复制您的数据并运行它,它的工作原理是:sort<filea.txt | uniq>fileb.txt。也许您忽略了扩展。我使用你从去一个Mac OS X的filea.txt其他一些fileb.txt
kasavbere

不需要使用重定向,sort什么uniq时候可以做的sort -u file -o file事情是传递管道的目的是删除重复的值,即您所fileb包含1,2,3,5,7的OP只希望2,3通过uniq -u file文件扩展名实现的唯一行没有任何内容对此,您的答案是错误的。
克里斯·西摩

12

您还可以打印出独特的价值在“文件”使用cat通过管道传输到指挥sortuniq

cat file | sort | uniq -u


9

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'))

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

仅供参考,在uniq手册页中:

“注意:'uniq'不会检测重复的行,除非它们是相邻的。您可能要先对输入进行排序,或者使用'sort -u'而不使用'uniq'。而且,比较会遵循'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

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


3
这太过分了。
SmallChess

9

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

awk '!seen[$0]++'

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


7

您可以使用:

sort data.txt| uniq -u

排序数据并按唯一值过滤



3

uniq如果文件是/可以排序的,应该会很好,如果由于某种原因而不能排序文件,则可以使用awk

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


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

这为我工作了类似的。如果未安排,请使用它。您可以删除排序(如果已安排)



0

这是我第一次尝试

skilla:~# uniq -u all.sorted  

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

做完猫之后-e all.sorted

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

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

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.