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



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



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



100 
100
100
99
99
26
25
24
24


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



100     3
99 2
26 1
25 1
24 2
637   5  

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

    Ничего не найдено.