
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 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, --uniquesem -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