amp*_*ino 71 linux sorting unique uniq
如何找到唯一的行并从文件中删除所有重复项?我的输入文件是
1
1
2
3
5
5
7
7
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
2
3
Run Code Online (Sandbox Code Playgroud)
sort file | uniq不会做这个工作.将显示所有值1次
Lev*_*sky 74
uniq 有你需要的选项:
-u, --unique
only print unique lines
Run Code Online (Sandbox Code Playgroud)
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3
Run Code Online (Sandbox Code Playgroud)
小智 21
我发现这更容易。
sort -u input_filename > output_filename
Run Code Online (Sandbox Code Playgroud)
-u代表独特。
kas*_*ere 19
使用方法如下:
sort < filea | uniq > fileb
Run Code Online (Sandbox Code Playgroud)
Vit*_*hou 12
虽然sort需要 O(n log(n)) 时间,但我更喜欢使用
awk '!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)
awk '!seen[$0]++'是 , 的缩写awk '!seen[$0]++ {print}',如果seen[$0]不为零,则打印 line(=$0) 。它需要更多的空间,但只需要 O(n) 时间。
uniq -u一直让我发疯,因为它不起作用.
所以不是那样,如果你有python(大多数Linux发行版和服务器已经拥有它):
#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'))
Run Code Online (Sandbox Code Playgroud)
仅供参考,来自uniq Man页面:
"注意:'uniq'不会检测重复的行,除非它们相邻.您可能希望先对输入进行排序,或使用'sort -u'而不使用'uniq'.此外,比较遵循'LC_COLLATE'指定的规则."
调用的正确方法之一:#sort nonUnique.txt | uniq的
$ 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
Run Code Online (Sandbox Code Playgroud)