Назад | Перейти на главную страницу

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

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

Например, если вывод cmd1 будет

100 100 100 99 99 26 25 24 24

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

100 3 99 2 26 1 25 1 24 2

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

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

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

  3 100
  2 99
  1 26
  1 25
  2 24

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

cmd1 | sort -gru

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

-u, --unique
without -c, output only the first of an equal run

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

Вы можете попробовать 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