AWK在执行分块操作时挂起

AWK在执行分块操作时挂起,awk,Awk,下面的Awk代码在两种模式/^[+]{3}/和/^$/之间分割出文件grep-diff.log。用空格删除中间的换行符 这是可行的,但最近它开始挂起,我无法调试它 任何关于如何更有效地做到这一点的提示或技巧都将受到欢迎 awk -v g=0 '{if ($0 ~ /^[+]{3}/) {chunk=$0 } else if ($0 ~ /^$/) {chunkAry[g]=chunk; chunk=""; g+=1} else {chunk=chunk " &quo

下面的Awk代码在两种模式/^[+]{3}/和/^$/之间分割出文件grep-diff.log。用空格删除中间的换行符

这是可行的,但最近它开始挂起,我无法调试它

任何关于如何更有效地做到这一点的提示或技巧都将受到欢迎

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的答复 谢谢你的提醒,Ed,非常感谢

我采纳了你的建议,去掉了数组,添加了调试行,但是脚本仍然挂起,没有错误

这是修改后的代码-

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"
“this”用于获取regex/^[+]{3}/和/^$/之间的所有行(包括模式),删除所有换行符并保存到输出文件

输入文件grep-diff.log为90 MB。在总共276起事件中,Awk挂起了第256起。它挂起的文本块是80KB,但除了它的大小是文件中最大的块之外,没有其他异常。完整的80KB块有1727行文件,Awk挂在1718行,那里没有什么奇怪的

Awk是否有可以设置的缓冲区大小限制?上周NodeJS也发生了类似的情况,手动增加缓冲区限制大小解决了这个问题

更新
我删除了导致脚本挂起的块,猜猜看,脚本在第256次出现时仍然挂起。新的256块很小,所以不是块大小。嗯,可能是什么?

我忘了提到我在Mac OX 10.12.6上运行这个脚本,所以使用的awk工具不是GNU的。随后,我使用brew(brew install Gawk)安装了GNU Gawk,并运行了相同的代码,但更改了Gawk的关键字awk。现在,脚本执行时不会出错。

您是否想过在结束部分的开头添加一个
打印“here”|“cat>&2”
,以查看是否正在访问它?脚本可以挂起的唯一方法是,如果它的输入文件挂起,即保持打开状态,而不向其写入任何其他内容。所以,看看是什么在创建grep-diff.log,添加调试print语句以确认永远不会到达结尾,下次此脚本挂起时,请终止正在写入grep-diff.log的进程,以查看此脚本是否完成,然后开始调试其他脚本。wrt
如何更有效地执行此操作
这一切都取决于
是什么(例如,现在似乎没有任何理由让您使用数组,但示例输入/输出会澄清这一点)-添加简洁、可测试的示例输入和预期输出以获得帮助。