删除大型词表中重复项的最快方法?

kar*_*lpy 14 performance bash awk sort

我需要对一个大型词表进行重复数据删除。我尝试了几个命令,并在 Linux中的Fastest `uniq` 工具如何删除大型多 GB 文本文件中的重复行做了一些研究他们解释说,对单词列表进行重复数据删除的最快方法似乎是使用awk.

awk  --> O(n) ?
sort --> O(n log n) ?
Run Code Online (Sandbox Code Playgroud)

然而,我发现这似乎不是真的。以下是我的测试结果:

time sort -u input.txt -o output.txt 
real    0m12.446s  
user    0m11.347s  
sys 0m0.906s**


time awk '!x[$0]++' input.txt > output.txt
real    0m47.221s  
user    0m45.419s  
sys 0m1.260s
Run Code Online (Sandbox Code Playgroud)

所以使用sort -u速度快了 3.7 倍。为什么是这样?有没有更快的方法来进行重复数据删除?

*********** 更新 ********

正如有人在评论中指出的那样,我的词表可能已经在某种程度上进行了排序。为了排除这种可能性,我使用random_number_wordlist_generator.py生成了两个词表。

List1 = 7 Mb  
List2 = 690 Mb

**Results AWK:**  
***List1***  
real    0m1.643s  
user    0m1.565s  
sys     0m0.062s

***List2***  
real    2m6.918s  
user    2m4.499s  
sys     0m1.345s

**Results SORT:**  
***List1***  
real    0m0.724s  
user    0m0.666s  
sys     0m0.048s

***List2***  
real    1m27.254s  
user    1m25.013s  
sys     0m1.251s
Run Code Online (Sandbox Code Playgroud)

小智 -2

速度差异是因为“sort”是一个命令(链接),而“awk”是一种编程语言(链接)。

“sort”命令接受输入并返回输出。而“awk”是一种编程语言,它首先解释代码(终端命令),然后开始对其进行处理。就那么简单。