Regex 列出所有异常及其发生次数的perl脚本

Regex 列出所有异常及其发生次数的perl脚本,regex,perl,bash,awk,Regex,Perl,Bash,Awk,我正在寻找Perl中的解决方案,因为出于某些原因,awk中的解决方案并不总是很好地工作 这里是目标的摘要:我有一个文件output.txt,它包含意外的异常:后面是不同的异常。。。例如,它看起来像 ... Unexpected exception : exception1 ... Unexpected exception : exception2 ... 现在我想写一个shell脚本摘要,总结output.txt,特别列出引发的异常及其发生次数。它应该像: exception1 : 9 exc

我正在寻找Perl中的解决方案,因为出于某些原因,awk中的解决方案并不总是很好地工作

这里是目标的摘要:我有一个文件output.txt,它包含意外的异常:后面是不同的异常。。。例如,它看起来像

...
Unexpected exception : exception1
...
Unexpected exception : exception2
...
现在我想写一个shell脚本摘要,总结output.txt,特别列出引发的异常及其发生次数。它应该像:

exception1 : 9
exception2 : 15
...
异常的顺序并不重要,好吧,如果它是按发生的次数排序的,它会更好

AWK解决方案是:

awk -F ' : ' '$1=="Unexpected exception"{a[$2]++} END{for (i in a) print "  ", i,a[i]}' $1
但我不知道为什么有时候有效,有时候无效。这就是为什么我在寻找Perl的解决方案。有人提议

perl -lne '$a{$1}++ if (/^(Unexpected exception) : (.*?)\s*$/); END { for $i (keys %a) { print " ", $i, $a{$i} } }' $1
请参阅,但它返回意外异常177,其中177是异常总数。那不是我想要的


有人能用Perl提出一个好的解决方案吗?

您的Perl反向引用不正确:

perl -lne '$a{$1}++ if (/^(Unexpected exception) : (.*?)\s*$/)
                          ^^^^^^^^^^^^^^^^^^^^^-$1 ^^^^^-$2
你想要

 $a{$2}++

相反。或者将第一个组转换为非捕获组:?:Un…

根据您的描述,这在awk中完全可行。如果您举一个awk脚本无法运行时的边缘情况的例子,也许我们可以修复它。不只是更改语言,也许您可以尝试找出awk解决方案失败的原因。我理解您的观点,但我的output.txt有几十个Mo,很难调试…谢谢您。。。可以根据发生的情况订购吗?