我有一个很大的 text.gz 文件 (2GB),我想按行拆分它。我尝试使用:
zcat text.gz | split -l1000000
但是这会生成一个大文件(在我终止它之前大约有 92GB),并且对硬盘造成太大负担。是否可以动态地将其导入 gzip?
答案1
答案2
这是一个循环awk
,gzip
它将按照行边界分割文件并压缩各个部分:
# Generate files part0.dat.gz, part1.dat.gz, etc.
prefix="part"
count=0
suffix=".dat"
lines=10000 # Split every 10000 line.
zcat thefile.dat.gz |
while true; do
partname=${prefix}${count}${suffix}
# Use awk to read the required number of lines from the input stream.
awk -v lines=${lines} 'NR <= lines {print} NR == lines {exit}' >${partname}
if [[ -s ${partname} ]]; then
# Compress this part file.
gzip --best ${partname}
(( ++count ))
else
# Last file generated is empty, delete it.
rm -f ${partname}
break
fi
done
要重新创建原始文件,只需zcat part*.dat.gz | gzip --best >thefile1.dat.gz
。由于gzip
使用的压缩选项不同,压缩文件的 MD5 校验和可能与原始文件不同,但未压缩的文件完全相同。