
Tengo un comando (cmd1) que busca en un archivo de registro para filtrar un conjunto de números. Los números están en orden aleatorio, por lo que suelo sort -gr
obtener una lista de números ordenados al revés. Puede haber duplicados dentro de esta lista ordenada. Necesito encontrar el recuento de cada número único en esa lista.
Por ejemplo, si la salida de cmd1 es
100 100 100 99 99 26 25 24 24
Necesito otro comando al que pueda canalizar el resultado anterior, de modo que obtenga:
100 3 99 2 26 1 25 1 24 2
Respuesta1
Si puede manejar la salida en un formato ligeramente diferente, puede hacer:
cmd1 | tr " " "\n" | uniq -c
Recibirías de vuelta:
3 100
2 99
1 26
1 25
2 24
Respuesta2
También agregue el modificador -u. Así tendrías:
cmd1 | sort -gru
Desde la página de manual de clasificación:
-u, --uniquesin -c, genera solo el primero de una ejecución igual
Respuesta3
(Supongo que su entrada es un número por línea, ya que ese es el resultado del tipo).
Podrías probar awk:
<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'
Esto le daría una lista sin ordenar (hasta donde yo sé, el orden en el que se recorren las matrices en awk no está definido), por lo que tendría que ordenarlas a su gusto nuevamente.
Respuesta4
$ echo '100 100 100 99 99 26 25 24 24' | perl -e 'while (<>) { chomp; my %nums; foreach (split(/ /)) { $nums{$_} += 1; }; foreach (sort {$b <=> $a} keys %nums) { print "$_ $nums{$_} " }; print "\n"; }'
100 3 99 2 26 1 25 1 24 2