Obtenha as linhas que aparecem mais comuns do arquivo no Linux


11

Eu tenho um arquivo de texto que possui várias palavras por linha.
Como posso encontrar as 12 linhas que aparecem com mais frequência no arquivo e exibi-las?
Eu não sou muito bom com comandos de script.

Se eu pudesse obter o comando e uma explicação para entender como usá-lo e expandir meu conhecimento sobre comandos, seria ótimo!


Respostas:


21

Você pode fazer isso facilmente com comandos internos.

  • Alimente o conteúdo do arquivo sort. Precisamos disso para o próximo passo.
  • Isso vai para uniq -c. Contará a ocorrência única de cada linha. Se as linhas semelhantes não forem adjacentes, isso não teria funcionado sem a classificação anterior.
  • Em seguida, alimente-o para outro sort, que agora é ordenado em ordem inversa ( r) e com base na ninterpretação numérica ( ) da uniqsaída. Precisamos da opção numérica, pois caso contrário, o espaço na frente dos números levaria a resultados errados (consulte a ajuda do GNUsort para obter mais informações).
  • Por fim, mostre apenas as doze primeiras linhas com head.

O comando seria então:

sort test.txt | uniq -c | sort -rn | head -n 12

A saída aqui contém a contagem real das ocorrências.

Para obter apenas a lista bruta de linhas, você pode canalizar a saída para sed:

sort test.txt | uniq -c | sort -rn | head -n 12 | sed -E 's/^ *[0-9]+ //g'

Exemplo:

I'm not there very often
I'm not there very often
Look at me!
Look at me!
Look at me!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!

Saída do primeiro comando, mas apenas selecionando 2 de head:

6 Hello there!
3 Look at me!

Saída do segundo comando:

Hello there!
Look at me!

1
Você precisa classificá-lo antes de usar uniq.
Cyrus

! @slhck: Obrigado Uma pergunta: Os sort -rntipos na ordem inversa usando como campo de classificação o número ao lado de cada linha produzida pela uniq -c? Eu pensei que algo assim k1ou algo parecido seria usado
Jim

@ Jim Exatamente. rinverte e nclassifica numericamente o número produzido por uniq. O que exatamente você quer dizer com isso k1?
slhck

@slhck: Eu estava tentando descobrir esses comandos usando mane entendi que uma sintaxe usando -kalgo deve ser usada para escolher o campo a ser classificado por #
Jim

@cYrus: Qual é o caso extremo de que uma classificação é necessária antes?
Jim

3

Se sua distribuição tiver logtop

cat your_file | logtop

Se o seu arquivo estiver em constante crescimento, como um arquivo de log, tente:

tail -f your_log | logtop
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.