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

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

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 -grpara obter uma lista de números com classificação reversa. Pode haver duplicatas nesta lista classificada. Preciso encontrar a contagem de cada número exclusivo dessa lista.

Por exemplo, se a saída de cmd1 for

100 100 100 99 99 26 25 24 24

Preciso de outro comando para o qual possa canalizar a saída acima, para obter:

100 3 99 2 26 1 25 1 24 2

Responder1

Se você conseguir que a saída esteja em um formato um pouco diferente, você poderia fazer:

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

Você voltaria:

  3 100
  2 99
  1 26
  1 25
  2 24

Responder2

Adicione também a opção -u. Assim você teria:

cmd1 | sort -gru

Na página de manual de classificação:

-u, --unique
sem -c, produz apenas o primeiro de uma execução igual

Responder3

(Presumo que sua entrada seja um número por linha, pois é isso que sort resultaria.)

Você poderia tentar awk:

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

Isso lhe daria uma lista não classificada (a ordem em que os arrays são percorridos no awk é indefinida, até onde eu sei), então você teria que classificar de acordo com sua preferência novamente.

Responder4

$ 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

informação relacionada