如何按值的频率排序?

问题描述 投票:0回答:3

我正在尝试创建一个程序来计算数据文件列中出现的不同值。所以,如果一列的可能值为 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
perl sorting count key
3个回答
8
投票

这是常见问题解答:

perldoc -q 排序

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";
}

输出:

A       456
C       344
B       234

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

2
投票

一些补充意见:

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

如果您粘贴实际代码(尽可能缩写),那么您帮助我们帮助您。 当人们重新创建实际代码时,他们经常掩盖或忽略问题的根源。

   chomp;
   my @U = split / /;

这会分割空格字符并查找第二个空格之后的计数;这通常更容易做到:

   my @U = split ' ';

split
与常量空格一起使用,而不是在任何空白序列上拆分正则表达式,就像
split /\s+/
一样,除了它忽略尾随空白......这是一个足够常见的事情,有一个特殊的语法。请注意,咀嚼变得不必要了。

© www.soinside.com 2019 - 2024. All rights reserved.