У меня есть 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}}}'