Classificar arquivo para duplicatas se for maior que um determinado número

Classificar arquivo para duplicatas se for maior que um determinado número

Tenho um file.logarquivo 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 10para 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 5e 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 headlimitar 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 awkfiltrar esses resultados:

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

O awkno final imprime apenas as linhas que correspondem a contagens maiores ou iguais a 10. O headno 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 sorte head.

A contagem é feita incrementando um elemento em um array associativo c, onde a linha atual de entrada é usada como chave.

O ENDbloco (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}}}'

informação relacionada