Contando duplicatas em uma sequência classificada usando ferramentas de linha de comando

4

Eu tenho um comando (cmd1) que percorre um arquivo de log para filtrar um conjunto de números. Os números estão em ordem aleatória, então eu uso sort -gr para obter uma lista ordenada de números invertidos. Pode haver duplicatas nessa lista classificada. Preciso encontrar a contagem para cada número único nessa lista.

Por exemplo, se a saída de cmd1 for

100 100 100 99 99 26 25 24 24

Eu preciso de outro comando para canalizar a saída acima, para que eu tenha:

100 3 99 2 26 1 25 1 24 2
    
por letronje 07.07.2009 / 15:42

4 respostas

15

Se você puder manipular a saída em um formato ligeiramente diferente, faça o seguinte:

cmd1 | tr " " "\n" | uniq -c

Você voltaria:

  3 100
  2 99
  1 26
  1 25
  2 24
    
por 07.07.2009 / 15:45
1

Inclua também o comutador -u. Assim você teria:

cmd1 | sort -gru

A partir do tipo de página:

-u, --unique
sem -c, gera apenas o primeiro de uma corrida igual     
por 07.07.2009 / 16:36
0

(Estou supondo que sua entrada seja um número por linha, já que é esse tipo de saída.)

Você pode tentar o awk:

<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'

Isso forneceria uma lista não ordenada (a ordem em que as matrizes são percorridas no awk é indefinida, até onde eu sei), então você teria que classificar do seu jeito novamente.

    
por 07.07.2009 / 16:10
0
$ 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
    
por 07.07.2009 / 17:25