我在Python中有一个实用程序脚本:
#!/usr/bin/env python
import sys
unique_lines = []
duplicate_lines = []
for line in sys.stdin:
if line in unique_lines:
duplicate_lines.append(line)
else:
unique_lines.append(line)
sys.stdout.write(line)
# optionally do something with duplicate_lines
Run Code Online (Sandbox Code Playgroud)
这个简单的功能(uniq无需先排序,稳定排序)必须作为简单的UNIX实用程序提供,不是吗?也许是管道中过滤器的组合?
询问的原因:在我无法从任何地方执行python的系统上需要此功能
这里提出了类似的问题,但他们没有解决为什么sort和awk之间存在速度差异。
我首先在Unix Stackexchange上提出了这个问题,但既然他们告诉我这对于 Stackoverflow 来说是一个很好的问题,我会将其发布在这里。
我需要对一个大的单词列表进行重复删除。我尝试了几个命令,并在这里和这里做了一些研究,他们解释说,删除重复单词列表的最快方法似乎是使用 awk,因为 awk 不会对列表进行排序。它使用哈希查找来跟踪项目并删除重复项。由于 AWK 使用哈希查找,他们认为大 O 是这样的
awk --> O(n) ?
排序 --> O(n log n) ?
然而我发现这不是真的。这是我的测试结果。我使用这个 python 脚本生成了两个随机单词列表。
列表 1 = 7 Mb
列表 2 = 690 Mb
测试命令
sort -u input.txt -o output.txt
awk '!x[$0]++' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
结果 AWK:
List1
real 0m1.643s
user 0m1.565s
sys 0m0.062s
List2
真实2m6.918s
用户2m4.499s
系统0m1.345s
结果排序:
List1
real 0m0.724s
user 0m0.666s
sys …