假设binsize
是每个块需要的行数,您可以在逐步执行文件时维护和重置行计数器,并在awk中设置备用输出文件,而不是使用shell重定向。
awk -v binsize=60000 '
BEGIN {
outfile="output_chunk_1.txt"
}
count > binsize {
if (filenum>1) {
close(outfile)
}
filenum++
outfile="output_chunk_" filenum ".txt"
count=0
}
{
count++
print > outfile
}
' my_large_file.txt
我没有实际测试此代码,因此,如果不逐字工作,至少也应该给你使用的策略的想法。 :-)
这个想法是,我们将逐步通过文件,每当我们的块的行数超过binsize
时,更新变量中的文件名。请注意,close(outfile)
并不是绝对必要的,因为awk当然会在退出时关闭任何打开的文件,但它可以为每个打开的文件句柄节省几个字节的内存(这只有在许多输出文件)。
这就是说,你可以做几乎同样的事情在bash独自:
#!/usr/bin/env bash
binsize=60000
filenum=1; count=0
while read -r line; do
if [ $count -gt $binsize ]; then
((filenum++))
count=0
fi
((count++))
outfile="output_chunk_${filenum}.txt"
printf '%s\n' "$line" >> $outfile
done < my_large_file.txt
(也未经测试。)
虽然我倒是希望的 awk的解决方案比bash快,它可能不会伤害你自己的基准。 :)
为什么不使用'split(1)'? – peak
这似乎也是一个合理的解决方案。 –