在整理过程中AWK挂起

时间:2017-08-24 13:58:52

标签: 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 " " $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。 Awk在总共276个事件中挂起第256次。它挂起的文本块是80 KB,但除了它的大小之外没有任何异常是文件中最大的块。完整的80 KB块有1727个文件行,Awk挂在1718行,没有什么奇怪的。

Awk是否有可设置的缓冲区大小限制?上周与Node JS发生了类似的事情,其中​​手动缓冲区限制大小的增加解决了这个问题。

更新

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

1 个答案:

答案 0 :(得分:0)

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