подсчет дубликатов в отсортированной последовательности с помощью инструментов командной строки
у меня есть команда (cmd1), которая greps через файл журнала, чтобы отфильтровать набор чисел. Цифры
в случайном порядке, поэтому я использую sort-gr для получения обратного отсортированного списка чисел. Там могут быть дубликаты в
это отсортированный список. Мне нужно найти количество вхождений каждого уникального номера в этом списке.
например, если выход cmd1:
100
100
100
99
99
26
25
24
24
мне нужна другая команда, в которую я могу передать вышеприведенный вывод, так что я получаю:
100 3
99 2
26 1
25 1
24 2
5 ответов:
Как насчет;
$ echo "100 100 100 99 99 26 25 24 24" | tr " " "\n" | sort | uniq -c | sort -k2nr | awk '{printf("%s %s ",,)}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", , }'100 3 99 2 26 1 25 1 24 2
в Баш, мы можем использовать ассоциативный массив для подсчета экземпляров каждого входного значения. Предполагая, что у нас есть команда
$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
Comments