在perl中对输出(数组)进行排序

时间:2014-02-28 07:58:18

标签: perl sorting

(我正在寻找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
...

有谁知道这样做?

3 个答案:

答案 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