Сортировать файл на наличие дубликатов, если их больше определенного числа

Сортировать файл на наличие дубликатов, если их больше определенного числа

У меня есть file.logфайл с данными, которые могут встречаться, а могут и не встречаться более одного раза.

a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e

В настоящее время я использую sort file.log | uniq -c | sort -rn | head -n 10сортировку по количеству дубликатов, найденных в файле, но я получаю 10 самых частых вхождений. Так, например, если один символ появляется в файле 5 раз, он говорит 5и соответствующий ему символ.

Как мне вывести строки, чтобы получить символы, которые встречаются/повторяются в файле больше определенного количества раз? Например, чтобы получить только те символы, которые встречаются более 10 раз. И желательно способ определить, сколько из этих символов выводить, например, только 5 результатов символов, которые встречаются 10 или более раз.

решение1

Используя предоставленные вами входные данные, если вы хотите найти, какие символы встречаются больше или равны трем раза: ведите подсчет и выведите строку, когда она появляется в третий раз.

$ awk '++count[$0] == 3' file
a
b

Передайте это в Pipe to, headчтобы ограничить вывод. Это явно не сортирует по количеству вхождений. Чтобы сделать это, используйте GNU awk:

gawk -v limit=3 '
    { ++count[$0] }
    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        n = 0
        for (line in count) {
            if (n == limit) break
            print count[line], line
            ++n
        }
    }
' file

выходы

6 a
3 b
2 d

Ссылкаhttps://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

решение2

Вы можете использовать начало исходного конвейера, а затем awkотфильтровать эти результаты:

sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5

В awkконце печатаются только те строки, которые соответствуют числам, большим или равным 10. headВ концеоченьend ограничивает общий результат максимум пятью строками.

Но вы можете сделать немного больше awk:

awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5

Сначала выполняется подсчет и отсеивание строк с малым количеством awk, а затем выводятся пять лучших результатов с помощью sortи head.

Подсчет осуществляется путем увеличения элемента в ассоциативном массиве c, где в качестве ключа используется текущая строка ввода.

Блок END(который активируется после считывания последней строки из file.log) перебирает все ключи в c, и если ключ соответствует количеству, большему или равному 10, количество выводится вместе со строкой, содержащей это количество.

решение3

sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'

Связанный контент