如何从 linux 中的一个非常大的文件中获取唯一行?

How get unique lines from a very large file in linux?

我有一个非常大的数据文件(255G;3,192,563,934 行)。不幸的是,我的设备上只有 204G 免费 space(我无法使用其他设备)。我做了一个随机样本,发现在给定的 100K 行中,大约有 10K 行......但是文件没有排序。

通常我会使用,比如:

pv myfile.data | sort | uniq > myfile.data.uniq

让它 运行 一天左右。这在这种情况下不起作用,因为我没有足够的 space 留在设备上用于临时文件。

我在想我可以使用 split,也许,并在一个新文件中一次对大约 500K 行进行流式处理 uniq。有没有办法做这样的事情?

我想我也许可以做类似的事情

tail -100000 myfile.data | sort | uniq >> myfile.uniq && trunc --magicstuff myfile.data

但我想不出一种方法来正确地运行分类文件。

使用sort -u代替sort | uniq

这允许 sort 更早地丢弃重复项,GNU coreutils 足够聪明,可以利用这一点。