以下Awk代码将两个模式/^[+] {3} /和/^$ /之间的文件grep-diff.log分块。用空格删除中间的换行符。AWK在Chunking挂起时挂起
这有效,但最近它已经开始挂起,我无法调试它。
如何更有效地做到这一点的任何提示或技巧将受到欢迎。
awk -v g=0 '{if ($0 ~ /^[+]{3}/) {chunk=$0 }
else if ($0 ~ /^$/) {chunkAry[g]=chunk; chunk=""; g+=1}
else {chunk=chunk " " $0}}
END {chunkAry[g]=chunk; chunk="";
for (c in chunkAry) print "Chunk : ",c, " " chunkAry[c]}' $(pwd)/grep-diff.log > "$(pwd)/chunked-diff.log"
回复评论1
感谢抬头版,多apprecicated。
我已经采取了你的建议,摆脱了阵列,并添加了调试线,但脚本仍然挂起没有错误。
这里是修改后的代码 -
awk -v g=0 '{if ($0 ~ /^[+]{3}/) {chunk=$0 }
else if ($0 ~ /^$/) {print "Chunk ",g," : ",chunk; chunk=""; g+=1}
else {chunk=chunk " " $0}}
END {print "Chunk ",g," : ",chunk; chunk=""; print "Here : " | "cat>&2"}' $(pwd)/grep-diff.log > "$(pwd)/chunked-diff.log"
的 “本” 是取正则表达式/^[+]之间的所有行{3} /和/^$ /包容的图案,并删除所有换行符发生并保存到输出文件。
输入文件grep-diff.log为90 MB。 awk挂在总共276次的256次事件中。它挂起的文本块大小为80 KB,但除了大小是该文件中最大的块以外,没有任何异常。整个80 KB的块有1727个文件行,Awk挂在1718行,没有什么奇怪的。
Awk是否具有可设置的缓冲区大小限制?上周发生了类似于Node JS的事情,手动缓冲区限制增加了问题。
更新
我切出这是导致脚本挂块,并猜测,剧本依然挂在第256位发生。新的第256块很小,所以它不是块大小。嗯,它可能是什么?
是否发生了你在这里添加'print'“|在“END”部分的开始部分输入“cat>&2”'来查看它是否到达?脚本可以挂起的唯一方法是如果输入文件挂起,即保持打开状态而没有其他任何内容被写入。因此,请研究创建grep-diff.log的任何内容,添加该调试打印语句以确认END永远不会到达,并且下次该脚本挂起时会终止正在写入grep-diff.log的进程以查看此脚本完成,然后启动调试其他脚本。 –
and wrt'如何更有效地做到这一点'这一切都取决于'this'是什么(例如,现在似乎没有任何理由让你使用一个数组,但样本输入/输出将清除) - 添加简洁,可测试的样本输入和预期输出以获得帮助。 –