2010-12-23 78 views
5

我正在嘗試創建一個程序來計算數據文件的列中出現的不同值。因此,它會像,如果列的可能值是A,B,C的輸出是一樣的東西在Perl中,如何按值的頻率進行排序?

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 
+4

[perldoc -f printf](http://perldoc.perl.org/functions/printf.html):當一個簡單的「`print」「時,不要陷入使用」`printf`「的陷阱會做。 「`print`」更高效且不易出錯。 – 2010-12-23 15:28:44

回答

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

呵呵,我很習慣C#,我忘了如何在Perl中進行排序! – tster 2010-12-23 15:26:55

8

這是一個常見問題:

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 
2

一些補充意見:

的輸出是一樣的東西......做這樣的事情

您幫助我們來幫助你,如果你粘貼您的實際代碼,簡稱如果可能的話。 當人們重新創建他們的實際代碼時,他們經常會模糊或忽略他們問題的根源。

chomp; 
    my @U = split//; 

這會在空格字符上分割並在第二個空格之後尋找計數;它往往更容易做:

my @U = split ' '; 

split以恆定的空間,而不是一個正則表達式拆分上空白的任何序列中,像split /\s+/但它忽略尾隨空白......這是一個常見足夠的事情做,有這個特殊的語法。請注意,chomp變得不必要。

相關問題