Sed

Linux 中最快的 uniq 工具

  • April 21, 2020

我有大文本文件(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)記憶體。

每種方法都將使用大量記憶體,用於對輸入進行排序或跟踪已看到哪些輸入,以便刪除重複項。

引用自:https://unix.stackexchange.com/questions/128775