100 наиболее часто используемых строк в файле - PullRequest
1 голос
/ 31 марта 2012

Как найти 100 самых популярных строк (слов) в файле .txt с помощью Perl?Пока у меня есть следующее:

use 5.012;
use warnings;

open(my $file, "<", "file.txt");

my %word_count;
while (my $line = <$file>) {
  foreach my $word (split ' ', $line) {
     $word_count{$word}++;
  } 
} 

for my $word (sort keys %word_count) {
  print "'$word': $word_count{$word}\n";
}

Но это учитывает только каждое слово и организует его в алфавитном порядке.Я хочу, чтобы 100 самых часто используемых слов в файле были отсортированы по количеству вхождений.Есть идеи?

По теме: Подсчет количества повторений строки в файлах perl

1 Ответ

8 голосов
/ 31 марта 2012

Из прочтения справочной страницы perlfaq4 (1) можно научиться сортировать хэши по значению . Так что попробуй это. Это скорее идиоматически «перлино», чем ваш подход.

#!/usr/bin/env perl    
use v5.12;
use strict;
use warnings;
use warnings FATAL => "utf8";
use open qw(:utf8 :std);

my %seen;
while (<>) {
    $seen{$_}++ for split /\W+/;  # or just split;
}

my $count = 0;
for (sort {
        $seen{$b} <=> $seen{$a}
                  ||
           lc($a) cmp lc($b)    # XXX: should be v5.16's fc() instead
                  ||
              $a  cmp  $b
     } keys %seen)
{
    next unless /\w/;
    printf "%-20s %5d\n", $_, $seen{$_};
    last if ++$count > 100;
}

При запуске против самого себя первые 10 строк вывода:

seen                     6
use                      5
_                        3
a                        3
b                        3
cmp                      2
count                    2
for                      2
lc                       2
my                       2
...