![我可以在一次操作中解压缩并合并排序的文本文件吗?](https://linux22.com/image/32853/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%9C%A8%E4%B8%80%E6%AC%A1%E6%93%8D%E4%BD%9C%E4%B8%AD%E8%A7%A3%E5%8E%8B%E7%BC%A9%E5%B9%B6%E5%90%88%E5%B9%B6%E6%8E%92%E5%BA%8F%E7%9A%84%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%90%97%EF%BC%9F.png)
我有数以万计的 gzip 文本文件,每个文件都已经在内部进行了排序。
我编写了一个脚本来解压缩它们(创建副本),然后用于sort -m
合并它们。
一切都运行得很好,但在尝试提高性能时,我注意到解压缩操作约占总运行时间的 16-20%。
基本上,合并操作必须重复扫描整个文本文件,一次将 16 个文件合并为 1 个。通常,这会导致对我拥有的数据进行大约 4-5 次完整扫描。解压缩实际上会增加一次额外的扫描。
通过 50-100 GB 的数据进行 5-6 次扫描中的 1 次节省是一笔巨大的节省。
gunzip
因此,我开始想知道是否可以将直接输出输入sort
(或其他一些工具),并基本上将解压缩轮与第一轮合并结合起来。输出不会被 gzip 压缩。
有谁知道这是否可以做到?理想情况下使用标准工具,但如果符合要求,我也愿意使用第三方工具。
答案1
您可以通过程序zcat
(或gzip -cd
)将解压后的数据写入标准输出。从那里,您可以使用 bash 的进程替换。1.gz
是数字 1 到 3;a.gz
是字母 a 到 c;是z.gz
数字 4 和字母 d:
$ sort -m <(zcat 1.gz) <(zcat a.gz) <(zcat z.gz)
1
2
3
4
a
b
c
d
希望你的数据更有趣一些。