2010-12-23 14 views
5

Estoy tratando de crear un programa para contar los diferentes valores que se producen en una columna de un archivo de datos. Por lo tanto, sería algo así como, si los valores posibles de una columna son A, B, C. La salida es algo así comoEn Perl, ¿cómo puedo ordenar por frecuencia de un valor?

A 456 
B 234 
C 344 

he sido capaz de obtener los recuentos de funcionamiento de A, B y C con facilidad haciendo algo como esto

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

Por ejemplo, aquí estoy contando la segunda columna del archivo en el camino dado.

¿Cómo puedo ordenar la salida del printf por las cuentas en lugar de las teclas (o los valores de A, B, C) para obtener -

A 456 
C 344 
B 234 
+4

[perldoc -f printf] (http://perldoc.perl.org/functions/printf.html): No caiga en la trampa de usar un "' printf' "cuando un simple" 'print'" haría. El "' print' "es más eficiente y menos propenso a errores. –

Respuesta

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

¡Oh hombre, estoy tan acostumbrado a C#, me olvidé de hacer una especie en Perl! – tster

+4

Parece que el póster desea ordenar en orden descendente, por lo que cambiaría a y b. – runrig

+2

@runrig: gracias, corrigió –

8

Este es un 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 
2

Algunos comentarios adicionales:

La salida es algo así como ... haciendo algo como esto

Usted ayuda a ayudarle si pega el código real, abreviado en lo posible. Cuando las personas recrean su código real, a menudo ocultan u omiten la fuente misma de su problema.

chomp; 
    my @U = split//; 

Esto se divide en caracteres de espacio y busca el recuento después del segundo espacio; a menudo es más fácil de hacer:

my @U = split ' '; 

split se utiliza con un espacio constante en lugar de un divisiones de expresiones regulares en cualquier secuencia de espacios en blanco, como split /\s+/ excepto que ignora espacios en blanco ... Esto es algo bastante común para hacer eso hay una sintaxis especial para eso. Tenga en cuenta que la chomp se vuelve innecesaria.

Cuestiones relacionadas