
Desde tiempos inmemoriales he utilizado ... | sort | uniq -c | sort -nr
para agrupar y contar líneas de entrada, para contar cuántas de cada línea hay en la entrada.
¿Hay alguna forma mejor? ¿Acabo de adquirir un mal hábito? ¿Existe una mejor manera de utilizar las herramientas estándar de Unix que se instalarán en Ubuntu Linux 18.04+ (o cosas que ya apt-get
no existen?)
Respuesta1
Creo que tienes el camino estándar y obvio *nix allí. Es un enfoque perfectamente bueno y razonable:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
2 cc
2 aa
1 dd
1 bb
Claro, podrías usar un pequeño script en su lugar y así usar solo un comando. por ejemplo, con gawk
:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
gawk '
BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
{ count[$0]++ }
END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb
O Perla:
$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' |
perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd
Pero eso no es más que reinventar la rueda. Además, ambos scripts cargan repetidamente todas las entradas en la memoria, lo que puede ser un problema cuando se manejan grandes cantidades de datos. Así que quédate con lo que estás haciendo. Es una buena solución, probablemente la más eficiente que existe.