В Perl как сортировать по частоте значения? - PullRequest
5 голосов
/ 23 декабря 2010

Я пытаюсь создать программу для подсчета различных значений, которые встречаются в столбце файла данных. Таким образом, было бы что-то вроде, если бы возможные значения столбца были 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};
     }

Например, здесь я считаю второй столбец файла по указанному пути.

Как отсортировать вывод printf по количеству, а не по ключам (или значениям A, B, C), чтобы получить -

A   456
C   344
B   234

Ответы [ 3 ]

8 голосов
/ 23 декабря 2010

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
3 голосов
/ 23 декабря 2010
for my $w (sort {$count{$b} <=> $count{$a}} keys %count) {
    print "$w\t$count{$w}\n";
}
2 голосов
/ 23 декабря 2010

Некоторые дополнительные комментарии:

Вывод что-то вроде ... делая что-то вроде этого

Вы помогаете нам помогать вам, если вы вставляете свой фактический код, сокращенный, где это возможно. Когда люди воссоздают свой фактический код, они часто скрывают или опускают сам источник своей проблемы.

   chomp;
   my @U = split / /;

Это разделяет пробелы и ищет счет после второго пробела; это часто проще сделать:

   my @U = split ' ';

split используется с постоянным пробелом вместо регулярных выражений, разделяется на любую последовательность пробелов, например split /\s+/, за исключением того, что он игнорирует конечные пробелы ... это достаточно распространенная вещь, чтобы сделать, что есть специальный синтаксис для Это. Обратите внимание, что грызть становится ненужным.

...