Ответ 1
как насчет;
$ echo "100 100 100 99 99 26 25 24 24" \
| tr " " "\n" \
| sort \
| uniq -c \
| sort -k2nr \
| awk '{printf("%s\t%s\n",$2,$1)}END{print}'
Результат:
100 3
99 2
26 1
25 1
24 2
У меня есть команда (cmd1), которая проходит через файл журнала, чтобы отфильтровать набор чисел. Числа в случайном порядке, поэтому я использую sort -gr для получения обратного отсортированного списка чисел. Внутри могут быть дубликаты этот отсортированный список. Мне нужно найти счетчик для каждого уникального номера в этом списке.
Например, если выход cmd1 равен:
100
100
100
99
99
26
25
24
24
Мне нужна еще одна команда, с которой я могу передать вывод выше, так что я получаю:
100 3
99 2
26 1
25 1
24 2
как насчет;
$ echo "100 100 100 99 99 26 25 24 24" \
| tr " " "\n" \
| sort \
| uniq -c \
| sort -k2nr \
| awk '{printf("%s\t%s\n",$2,$1)}END{print}'
Результат:
100 3
99 2
26 1
25 1
24 2
uniq -c
работает как минимум для GNU uniq 8.23 и делает именно то, что вы хотите (при условии сортировки ввода).
Если порядок не важен
# echo "100 100 100 99 99 26 25 24 24" | awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(o in a) printf "%s %s ",o,a[o]}'
26 1 100 3 99 2 24 2 25 1
Численно сортировать числа в обратном порядке, затем подсчитывать дубликаты, а затем менять слова слева и справа. Выровнять по столбцам.
printf '%d\n' 100 99 26 25 100 24 100 24 99 \
| sort | uniq -c | sort -nr | awk '{printf "%-8s%s\n", $2, $1}'
100 3
99 2
26 1
25 1
24 2
В Bash мы можем использовать ассоциативный массив для подсчета экземпляров каждого входного значения. Предположим, что у нас есть команда $cmd1
, например
#!/bin/bash
cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'
Затем мы можем подсчитать значения в переменной массива a
с помощью математического оператора ++
для соответствующих записей массива:
while read i
do
((++a["$i"]))
done < <($cmd1)
Мы можем напечатать результирующие значения:
for i in "${!a[@]}"
do
echo "$i ${a[$i]}"
done
Если порядок вывода важен, нам может понадобиться внешний sort
для ключей:
for i in $(printf '%s\n' "${!a[@]}" | sort -nr)
do
echo "$i ${a[$i]}"
done