如何从 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 足够聪明,可以利用这一点。
我有一个非常大的数据文件(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 足够聪明,可以利用这一点。