Подтвердить что ты не робот

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

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

Например, если выход cmd1 равен:

100 
100 
100 
99 
99 
26 
25 
24 
24

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

100     3
99      2
26      1
25      1
24      2
4b9b3361

Ответ 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

Ответ 2

uniq -c работает как минимум для GNU uniq 8.23 ​​и делает именно то, что вы хотите (при условии сортировки ввода).

Ответ 3

Если порядок не важен

# 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

Ответ 4

Численно сортировать числа в обратном порядке, затем подсчитывать дубликаты, а затем менять слова слева и справа. Выровнять по столбцам.

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

Ответ 5

В 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