2017-08-24 160 views
-1

以下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块很小,所以它不是块大小。嗯,它可能是什么?

+0

是否发生了你在这里添加'print'“|在“END”部分的开始部分输入“cat>&2”'来查看它是否到达?脚本可以挂起的唯一方法是如果输入文件挂起,即保持打开状态而没有其他任何内容被写入。因此,请研究创建grep-diff.log的任何内容,添加该调试打印语句以确认END永远不会到达,并且下次该脚本挂起时会终止正在写入grep-diff.log的进程以查看此脚本完成,然后启动调试其他脚本。 –

+0

and wrt'如何更有效地做到这一点'这一切都取决于'this'是什么(例如,现在似乎没有任何理由让你使用一个数组,但样本输入/输出将清除) - 添加简洁,可测试的样本输入和预期输出以获得帮助。 –

回答

0

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