Подсчет дубликатов в отсортированной последовательности с использованием инструментов командной строки

У меня есть команда (cmd1), которая просматривает файл журнала, чтобы отфильтровать набор чисел. Числа в случайном порядке, поэтому я использую sort -gr получить обратно отсортированный список номеров. В этом отсортированном списке могут быть дубликаты. Мне нужно найти количество для каждого уникального номера в этом списке.

Например, если выходные данные cmd1

100 100 100 99 99 26 25 24 24

Мне нужна другая команда, к которой я могу передать вышеприведенный вывод, чтобы я получил:

100 3 99 2 26 1 25 1 24 2

4 ответа

Решение

Если вы можете обработать вывод в несколько ином формате, вы можете сделать:

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

Вы вернетесь:

  3 100
  2 99
  1 26
  1 25
  2 24

Также добавьте ключ -u. Таким образом вы бы имели:

cmd1 | sort -gru

Из справочной страницы сортировки:

-у, --unique
без -c вывести только первое из одинакового прогона

(Я предполагаю, что ваш ввод - одно число на строку, так как это будет вывод сортировки.)

Вы можете попробовать awk:

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

Это даст вам несортированный список (насколько я знаю, порядок, в котором проходят массивы в awk, не определен), так что вам придется снова сортировать по своему вкусу.

$ 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
Другие вопросы по тегам