如何从Linux中的一个很大的文件中获得唯一的行?

Sir*_*ert 2 linux large-files uniq

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

通常我会说:

pv myfile.data | sort | uniq > myfile.data.uniq
Run Code Online (Sandbox Code Playgroud)

并让它运行一天左右。在这种情况下,这是行不通的,因为我的设备上没有足够的空间来存放临时文件。

我当时想我可以使用split,并且一次可以uniq在500K行上进行流传输到一个新文件中。有没有办法做这样的事情?

我以为我可以做类似的事情

tail -100000 myfile.data | sort | uniq >> myfile.uniq && trunc --magicstuff myfile.data
Run Code Online (Sandbox Code Playgroud)

但我想不出一种方法来正确截断文件。

tha*_*guy 5

使用sort -u代替sort | uniq

这样可以sort更早地丢弃重复项,并且GNU coreutils非常聪明,可以利用这一点。

  • 在[我的实验](/sf/answers/4022250361/)中,“sort (GNU coreutils) 8.31”似乎“不够”智能,无法在排序之前删除连续的重复项。要在*排序之前*删除顺序重复项,您始终可以使用 `uniq | 排序-u`。 (2认同)