SedLinux 中最快的
Linux 中最快的 uniq
工具
我有大文本文件(1.5 G),
我想知道 Linux 中最快、更可靠的工具是什麼。
我通常使用:
awk '!x[$0]++' file.txt
但是當我使用
htop
命令時,我看到我的記憶體使用量正在增加。我想知道對於大文件來說什麼是最快和更可靠的。
uniq? sort? sed? awk?
為什麼?
讓我們考慮每個解決方案的工作原理。
uniq
這要求文件已經排序。如果不是,則必須先通過管道將其通過sort
,這意味著sort
必須將整個文件讀入記憶體,對其重新排序(O(n log n)
),然後將其寫入管道。的工作uniq
非常便宜,因為它只需要比較其輸入的相鄰行。sort -u
這結合了sort | uniq
. 這必須像腳本一樣將所有獨特的輸入收集到記憶體awk
中,但它也會浪費時間在生成輸出之前對它們進行排序。這是O(n log n)
,儘管在這種情況下n
是唯一項目的數量,而不是所有輸入。所以它比管道好。sed
我不確定你為什麼列出這個,因為我根本想不出一個好的方法來做到這一點sed
。也許如果您首先對其進行排序並通過管道傳輸到sed
腳本,那麼有一種方法可以比較相鄰的行。所以sed
只是做它做的事情uniq
,並且uniq
可能盡可能高效地做它。awk
這可能是最好的,因為它只做最少的必要工作。在讀取每一行時,它會進行有效的雜湊查找以查看該行是否已在其記憶體中,並且僅將唯一行儲存為雜湊鍵,並將計數器儲存為值。(如果該行以前不存在,則條件為真,因此將列印該行。否則它不會。)這會佔用O(n)
時間和O(uniq n)
記憶體。每種方法都將使用大量記憶體,用於對輸入進行排序或跟踪已看到哪些輸入,以便刪除重複項。