Tenho um file.log
arquivo com dados que podem ou não ocorrer mais de uma vez.
a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e
Atualmente estou usando sort file.log | uniq -c | sort -rn | head -n 10
para classificá-los pela quantidade de duplicatas encontradas no arquivo, mas estou obtendo as 10 principais ocorrências. Assim, por exemplo, se um caractere reaparecer 5 vezes no arquivo, ele diz 5
e o caractere correspondente a ele.
Como posso gerar as linhas para obter os caracteres com mais de um certo número de ocorrências/duplicatas encontradas no arquivo? Por exemplo, para obter apenas os caracteres que ocorrem mais de 10 vezes. E de preferência uma forma de definir quantos desses caracteres serão gerados, por exemplo, apenas 5 resultados de caracteres que possuem 10 ou mais duplicatas.
Responder1
Usando a entrada fornecida, se você quiser descobrir quais caracteres aparecem maiores ou iguais a três vezes: mantenha uma contagem e imprima a linha na terceira vez que ela for vista
$ awk '++count[$0] == 3' file
a
b
Canalize isso para head
limitar a saída. Isso claramente não classifica por número de ocorrências. Para fazer isso, usando 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
saídas
6 a
3 b
2 d
Referênciahttps://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
Responder2
Você poderia usar o início do seu pipeline original e depois awk
filtrar esses resultados:
sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5
O awk
no final imprime apenas as linhas que correspondem a contagens maiores ou iguais a 10. O head
no finalmuitoend limita o resultado geral a um máximo de cinco linhas.
Você pode fazer um pouco mais awk
:
awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5
Isso faz a contagem e a eliminação das linhas de contagem baixa primeiro e awk
, em seguida, fornece os cinco principais resultados com sort
e head
.
A contagem é feita incrementando um elemento em um array associativo c
, onde a linha atual de entrada é usada como chave.
O END
bloco (que é acionado após a leitura da última linha de file.log
), itera sobre todas as chaves de c
, e se a chave corresponder a uma contagem maior ou igual a 10, a contagem é impressa junto com a linha que contém essa contagem.
Responder3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'