Contar duplicados en una secuencia ordenada usando herramientas de línea de comando

Contar duplicados en una secuencia ordenada usando herramientas de línea de comando

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 -grobtener 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, --unique
sin -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

información relacionada