(我正在为此problem寻找Perl的解决方案,因为awk
中的解决方案由于某些原因并不总能正常运行。
以下是目标的摘要:我有一个文件output.txt
,它包含Unexpected exception :
,后面跟着不同的例外...例如,它看起来像
...
Unexpected exception : exception1
...
Unexpected exception : exception2
...
现在我想编写一个shell脚本summary
,它总结了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
(请参阅here),但会返回Unexpected exception177
,其中177
是例外的总数。那不是我想要的。
有人可以在Perl中提出一个好的解决方案吗?
答案 0 :(得分:0)
您的perl反向引用不正确:
perl -lne '$a{$1}++ if (/^(Unexpected exception) : (.*?)\s*$/)
^^^^^^^^^^^^^^^^^^^^^-$1 ^^^^^-$2
你想要
$a{$2}++
代替。或者将第一个()
转换为非捕获组:(?:Un....)