假設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
這似乎也是一個合理的解決方案。 –