(我正在寻找Perl
this problem}的更好解决方案。
以下是目标的摘要:我有一个文件output.txt
,它包含Unexpected exception :
,后面跟着不同的例外...例如,它看起来像
...
Unexpected exception : exception1
...
Unexpected exception : exception2
...
这是一个Perl脚本,它通过列出引发的异常及其出现次数来汇总output.txt
:
perl -lne '$a{$2}++ if (/^(Unexpected exception) : (.*?)\s*$/); END { for $i (keys %a) { print " ", $i, " ", $a{$i} } }' $1
结果如下:
exception2 : 15
exception3 : 7
exception1 : 9
...
现在我想改进这个脚本,以便可以按字母顺序列出例外:
exception1 : 9
exception2 : 15
exception3 : 7
...
有谁知道如何更改此脚本以实现此目标?
此外,我可能希望按发生的递减顺序列出例外:
exception15 : 20
exception2 : 15
exception1 : 9
exception3 : 7
...
有谁知道这样做?
答案 0 :(得分:2)
按例外名称排序
perl -lne '$a{$2}++ if (/^(Unexpected exception) : (.*?)\s*$/); END { for $i (sort keys %a) { print " ", $i, " ", $a{$i} } }' $1
按出现次数排序
perl -lne '$keys{$2}++ if (/^(Unexpected exception) : (.*?)\s*$/); END { for $i (sort { $keys{$b} <=> $keys{$a} } keys %keys) { print " ", $i, " ", $keys{$i} } }' $1
答案 1 :(得分:1)
我希望这个脚本版本更具可读性:
#!/usr/bin/perl
use warnings;
use strict;
my %exceptions;
while (<DATA>) {
chomp;
$exceptions{$1}++ if (m/^Unexpected exception : (.*?)\s*$/);
}
print "Sorted by exception name:\n";
foreach my $exc (sort keys %exceptions) {
print "$exc : $exceptions{$exc}\n";
}
print "Sorted by exception count:\n";
foreach my $exc (sort { $exceptions{$b} <=> $exceptions{$a} } keys %exceptions) {
print "$exc : $exceptions{$exc}\n";
}
__DATA__
Unexpected exception : exception1
Unexpected exception : exception2
Unexpected exception : exception2
答案 2 :(得分:0)
Perl / sort / uniq解决方案。剥离前导文本,排序,然后计数:
perl -pe 's/Unexpected exception : //' input.txt | sort | uniq -c
要按出现次数排序,请添加额外的sort -g
:
perl -pe 's/Unexpected exception : //' input.txt | sort | uniq -c | sort -g