【问题标题】:A perl script to list all the exceptions and their number of occurrence列出所有异常及其出现次数的 perl 脚本
【发布时间】:2013-12-18 21:04:40
【问题描述】:

(我正在为此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 中提出一个好的解决方案?

【问题讨论】:

  • 根据您的描述,这在awk 是完全可行的。如果您举一个 awk 脚本不起作用时的边缘情况示例,也许我们可以修复它。
  • 不只是改变语言,也许您可​​以尝试找出awk 解决方案失败的原因。
  • 我理解你的意见,但是我的output.txt有几十个mo,很难调试...

标签: regex perl bash awk


【解决方案1】:

您的 perl 反向引用不正确:

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

你想要

 $a{$2}++

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

【讨论】:

  • 谢谢...是否可以根据情况订购?
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多