【问题标题】:How to merge multiple large .gz files into one in a efficient way?如何以有效的方式将多个大型 .gz 文件合并为一个?
【发布时间】:2020-01-08 02:41:18
【问题描述】:

我正在尝试将多个 (29) 个压缩文件 (.gz) 一个接一个地合并到一个文件中。

压缩文件大小约为 500MB,未压缩格式约为 30GB。所有文件都以我不希望在最终文件中出现的标题开头。

我尝试过使用zcatgzip,但是需要很多时间(超过3小时):

 zcat file*.gz | tail -n +2 | gzip -c >> all_files.txt.gz 

我也试过pigz:

 unpigz -c file*.gz | tail -n +2 | pigz -c >> all_files_pigz.txt.gz 

在这种情况下,我正在一个没有此命令且我无法安装任何东西的集群中工作。

我尝试的最后一件事是将所有内容与cat 合并:

 cat file*.gz > all_files_cat.txt.gz

这并不需要很多时间,但是当我要阅读它时,在一些品脱出现以下消息:

 gzip: unexpected end of file

我该如何处理?

【问题讨论】:

  • 遗憾的是,除非文件使用 BGZF 或其他可索引 gzip 格式压缩,否则剥离该内容的唯一方法是解压缩并重新打包整个文件。正如你所说,pigz 或 libdeflate 会比 gzip 快。您还可以考虑并行进行拆包。最后,如果您经常这样做,可能值得研究 bgzf。
  • @GemTaylor 谢谢宝石!我去看看

标签: bash compression gzip large-files gunzip


【解决方案1】:

如果您想删除每个未压缩文件的第一行,并将它们全部连接到一个压缩文件中,您将需要一个循环。类似的东西

for f in file*.gz; do
  zcat "$f" | tail -n +2
done | gzip -c > all_files_cat.txt.gz

如果有很多大文件,是的,这可能需要一段时间。也许使用比默认值更低的压缩级别(以更大的文件大小为代价)。或者使用与 gzip 不同的压缩程序;有很多选项,每个选项都有自己的速度和压缩比权衡。

【讨论】:

  • 但是使用通配符*,我会使用该字符串获取所有文件,不是吗?
  • @Marta_ma 这与您在问题中使用的模式相同。如果这与您的文件不匹配,请将其更改为适当的内容。只需确保您的目标文件与模式不匹配即可。
  • 我想说的是,因为有了通配符,我得到了我想要的所有文件,我不需要 for 循环
  • @Marta_ma 如果你想删除你所做的每个文件的第一行。 所有文件都以我不希望在最终文件中出现的标题开头。 如果不是这种情况,请编辑您的问题以澄清。
  • 你是对的,我想要,但这是我的小问题,因为稍后可以使用 sed 或其他命令来完成
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多