在Perl中,我如何按值的频率排序?

时间:2010-12-23 15:15:38

标签: perl sorting count key

我正在尝试创建一个程序来计算数据文件列中出现的不同值。所以,如果列的可能值是A,B,C,那就像是这样的。输出类似于

A   456
B   234
C   344

通过做这样的事情,我已经能够轻松获得A,B和C的运行计数

my %count; 
for my $f (@ffile) {

    open F, $f || die "Cannot open $f: $!";

    while (<F>) {
       chomp;
       my @U = split / /;

       $count{$U[2]}++; 
    }

}
   foreach my $w (sort keys %count) {
         printf $w\t$count{$w};
     }

例如,我在这里计算给定路径中文件的第二列。

如何通过计数而不是键(或值A,B,C)对printf的输出进行排序 -

A   456
C   344
B   234

3 个答案:

答案 0 :(得分:8)

这是一个FAQ:

perldoc -q sort

use warnings;
use strict;

my %count = (
    A => 456,
    B => 234,
    C => 344
);

for my $w (sort { $count{$b} <=> $count{$a} } keys %count) {
    print "$w\t$count{$w}\n";
}

__END__
A       456
C       344
B       234

答案 1 :(得分:3)

for my $w (sort {$count{$b} <=> $count{$a}} keys %count) {
    print "$w\t$count{$w}\n";
}

答案 2 :(得分:2)

其他一些评论:

  

输出类似......通过做这样的事情

如果您粘贴实际代码,请帮助我们,尽可能缩写。 当人们重新创建他们的实际代码时,他们经常会模糊或忽略他们问题的根源。

   chomp;
   my @U = split / /;

这会拆分空格字符,并在第二个空格后查找计数;它通常更容易做到:

   my @U = split ' ';

split使用常量空格而不是正则表达式分割任何空格序列,如split /\s+/,除了它忽略尾随空格...这是一个常见的事情,有这个特殊的语法。请注意,chomp变得不必要。