
У меня есть команда (cmd1), которая просматривает файл журнала, чтобы отфильтровать набор чисел. Числа расположены в случайном порядке, поэтому я использую ее sort -gr
для получения обратно отсортированного списка чисел. В этом отсортированном списке могут быть дубликаты. Мне нужно найти количество для каждого уникального числа в этом списке.
Например, если вывод cmd1 будет
100 100 100 99 99 26 25 24 24
Мне нужна еще одна команда, в которую я могу передать указанный выше вывод, чтобы получить:
100 3 99 2 26 1 25 1 24 2
решение1
Если вы можете справиться с выводом в немного ином формате, вы можете сделать следующее:
cmd1 | tr " " "\n" | uniq -c
Вы получите в ответ:
3 100
2 99
1 26
1 25
2 24
решение2
Также добавьте ключ -u. Таким образом, у вас будет:
cmd1 | sort -gru
Из страницы руководства по сортировке:
-u, --uniqueбез -c, вывести только первый из одинаковой последовательности
решение3
(Я предполагаю, что вы вводите по одному числу в строке, поскольку именно такие данные выведет sort.)
Вы можете попробовать awk:
<your_command> | awk '{numbers[$1]++} END {for (number in numbers) print number " " numbers[number]}'
Это даст вам несортированный список (насколько мне известно, порядок, в котором обрабатываются массивы в awk, не определен), поэтому вам придется снова сортировать его по своему усмотрению.
решение4
$ 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