合并、排序和删除大量 gzip 文件中的重复项

合并、排序和删除大量 gzip 文件中的重复项

我将合并 15 个不同的 gzip 文件。每个文件的大小从 2 GB 到 15 GB 不等,因此文件相对较大。我已经研究了最好的方法,但我仍然有一些问题。

概括:

从 15 个不同的 gzip 文件开始,我想以一个经过排序、重复的 gzip 格式的免费文件结束。

为了方便对话,我将文件标记如下:file1, file2...file15

我打算使用sort带有-u选项的命令。根据 sort 的手册页,这意味着:

-u, --unique with -c, check for strict ordering; without -c, output only the first of an equal run

所以我想做的是:

sort -u file* > sortedFile

根据我的理解,我将拥有一个已排序且没有任何重复项的文件。从我创建的测试文件来看,情况似乎如此,但只是想验证这是正确的?

现在我的困境又出现了另一个问题:

因为所有文件都是 gzip 格式,有没有办法使用 zcat 或其他方法通过管道输出进行排序,而不必首先从 gzip 转换为文本文件,组合然后将它们压缩回 gzip?这将节省大量时间。任何意见都会受到赞赏。我正在寻求这方面的建议;我并不反对研究,也不执着于我的方法,在开始对 120 GB 数据运行这些命令之前,我需要一些见解。

感谢人民!

答案1

问题是各个文件是未排序的,即如果您使用类似的东西sort -u file* > sortedFile,排序将必须加载所有文件的内容,然后对它们进行排序。我认为这是低效的,因为您可能没有超过 120 GB 的内存。

我建议您首先对所有文件进行单独排序,然后使用sort -m, 合并它们(此代码未经测试!):

for f in file*; do
  gzip -dc "$f" | sort > sorted.$f.bak
done
sort -m -u sorted.file*.bak > sortedFile
rm -f sorted.file*.bak

排序手册页的相关部分(例如http://unixhelp.ed.ac.uk/CGI/man-cgi?sort):

-m, --merge 合并已经排序的文件;不排序

更新: 看完之后https://stackoverflow.com/questions/930044/how-could-the-unix-sort-command-sort-a-very-large-file,我认为您的原始命令可能同样快,因为 sort 无论如何都会将其输入分割成可管理的块。您的命令行将如下所示:

 sort <(zcat file1) <(zcat file2) ... <(zcat file15) > sortedFile

这也将允许使用机器的多个核心。

相关内容