Linux 中最快的 `uniq` 工具

MLS*_*LSC 8 memory sed awk sort uniq

我有大文本文件(1.5 G),

我想知道 Linux 中最快、最可靠的工具是什么。

我通常使用:

awk '!x[$0]++' file.txt
Run Code Online (Sandbox Code Playgroud)

但是当我使用htop命令时,我看到我的内存使用量在增加。

我想知道对于大文件来说什么是最快和更可靠的。

uniq?
sort?
sed?
awk?
Run Code Online (Sandbox Code Playgroud)

为什么?

Bar*_*mar 17

让我们考虑每个解决方案的工作原理。

  • 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)内存。

每种方法都将使用大量内存,用于对输入进行排序或跟踪哪些输入已经看到,以便它们可以删除重复项。

  • @goldilocks,`sort` 使用临时文件(以智能方式)以避免填满内存。它的内存使用是有限制的。边界可通过某些排序实现进行自定义。让系统随机将内存交换到磁盘(这也会影响系统上的应用程序)更有效。 (8认同)