У меня есть команда (cmd1), которая просматривает файл журнала, чтобы отфильтровать набор чисел. Числа расположены в случайном порядке, поэтому я использую sort -gr, чтобы получить список чисел, отсортированный в обратном порядке. В этом отсортированном списке могут быть дубликаты. Мне нужно найти счетчик для каждого уникального числа в этом списке.
Например, если вывод cmd1:
100
100
100
99
99
26
25
24
24
Мне нужна другая команда, в которую я могу передать вывод, указанный выше, чтобы я получил:
100 3
99 2
26 1
25 1
24 2
bash
command-line
sorting
count
duplicates
Letronje
источник
источник
Ответы:
как насчет;
$ 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 2 24
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}' | head -n -1
итак, вы получаете:100 3 99 2 26 1 25 1 24 2
uniq -c
работает как минимум для GNU uniq 8.23 и делает именно то, что вы хотите (при условии отсортированного ввода).источник
sort
команду:sort file_name | uniq -c
если порядок не важен
# 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 -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'
источник
В 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
источник