我想自动执行将大型gzip
文件拆分为较小gzip
文件的过程,每个文件包含10000000
行(最后一次拆分将留下并且将小于10000000)。< / p>
这就是我现在正在做的事情,我实际上是通过计算剩余行数来重复的。
gunzip -c large_gzip_file.txt.gz | tail -n +10000001 | head -n 10000000 > split1_.txt
gzip split1_.txt
gunzip -c large_gzip_file.txt.gz | tail -n +20000001 | head -n 10000000 > split2_.txt
gzip split2_.txt
我继续这样做,重复如图所示直到结束。然后我打开这些并手动添加标题行。如何实现这一目标。
我在线搜索awk
和其他解决方案,但没有看到gzip或类似的情况。
答案 0 :(得分:1)
我认为awk
不是将gzip文件拆分成较小的文件,而是用于文本处理。以下是我解决问题的方法,希望有所帮助:
<强>步骤1:强>
gunzip -c large_gzip_file.txt.gz | split -l 10000000 - split_file_
split
命令可以将文件拆分成碎片,您可以指定每个碎片的大小,并为所有碎片提供前缀。
大型gzip文件将被拆分为多个名称前缀为split_file_
<强>步骤2 强>:
将标题内容保存到文件header_file.csv
中<强>步骤3:强>
for f in split_file*; do
cat header_file.csv $f > $f.new
mv $f.new $f
done
这里我假设您在拆分文件目录中工作,如果没有,请用绝对路径替换split_file*
,例如/path/to/split_file*
。迭代名称模式为split_file*
的所有文件,将标题内容添加到每个匹配文件的开头
答案 1 :(得分:1)
我会这样做:
gunzip
文件head
获取第一行并将其保存到另一个文件tail
获取文件的其余部分并将其传输到split
以生成每个10,000,000行的文件sed
将标题插入每个文件,或者只是将标题与每个文件相关联您需要将其包装在脚本或函数中,以便以后重新运行。这是一个尝试解决方案,经过轻微测试:
#!/bin/bash
set -euo pipefail
LINES=10000000
file=$(basename $1 .gz)
gunzip -k ${file}.gz
head -n 1 $file >header.txt
tail -n +2 $file | split -l $LINES - ${file}.part.
rm -f $file
for part in ${file}.part.* ; do
[[ $part == *.gz ]] && continue # ignore partial results of previous runs
gzip -c header.txt $part >${part}.gz
rm -f $part
done
rm -f header.txt
使用:
$ ./splitter.sh large_gzip_file.txt.gz
我会通过对中间文件使用临时目录(mktemp -d
)来进一步改进这一点,并确保脚本在退出后自行清理(使用trap
)。理想情况下,它还可以检查参数,可能接受指示每个部分的行数的第二个参数,并检查当前目录的内容以确保它不会破坏任何预先存在的文件。