bash - 如何以有效的方式将多个大型 .gz 文件合并为一个?
问题描述
我正在尝试将多个 (29) 压缩文件 (.gz) 一个接一个地合并到一个文件中。
压缩文件约为 500MB,未压缩格式约为 30GB。所有文件都以我不希望在最终文件中出现的标题开头。
我试过用zcat
and来做gzip
,但需要很多时间(超过 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
我该怎么办?
解决方案
如果要删除每个未压缩文件的第一行,并将它们全部连接到一个压缩文件中,则需要一个循环。就像是
for f in file*.gz; do
zcat "$f" | tail -n +2
done | gzip -c > all_files_cat.txt.gz
如果有很多大文件,是的,可能需要一段时间。也许使用比默认值更低的压缩级别(以更大的文件大小为代价)。或者使用与 gzip 不同的压缩程序;有很多选项,每个选项都有自己的速度和压缩比权衡。
推荐阅读
- swift - 带有静态变量的结构 vs 带有静态变量的类 vs 基于类的单例 vs 全局变量
- python - Python 处理包含混合数据的文本文件
- google-api - 在进行 postgresql 查询后调用谷歌表格时 Lambda 函数超时
- python-3.x - python os.getenv('APPDATA') 返回 none - os.environ 没有在数据字典中列出 APPDATA
- angular - 角度离子http请求将空数据发送到rest API
- git - 无法将更改推送到 GitHub
- http - 通过 http 发送文件而不实际创建任何文件
- c++11 - 将 Rcpp::List 转换为 const char* 向量的 C++ 向量
- python - 如何在不冻结 UI 的情况下使用 QProcess 循环的输出更新 UI?
- java - 将 java.util.Date 转换为 java.sql.Date 导致日期更改