Obter a contagem de ocorrências de palavras em arquivos de texto de todas as palavras e a saída de impressão classificadas

28

Eu tinha um comando que funcionaria através de um arquivo de texto, contaria todas as ocorrências das palavras e as imprimiria assim:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

Portanto, ele não pesquisa linha por linha, mas palavra por palavra, e o faz por todas as palavras, não apenas por uma palavra. Eu o encontrei em algum lugar nas internets há muito tempo, mas não consigo encontrar nem lembrar.

Kusalananda
fonte

Respostas:

33

Eu usaria em trvez de awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr apenas substitui espaços por novas linhas
  • grep -v "^\s*$" apara linhas vazias
  • sort preparar como entrada para uniq
  • uniq -c contar ocorrências
  • sort -bnr classifica em ordem inversa numérica enquanto ignora o espaço em branco

Uau. acabou por ser um ótimo comando para contar palavrões por linha

encontrar . -name "* .py" -exec cat {} \; | tr '[: espaço:]' '[\ n *]' | grep -v "^ \ s * $" | classificar | uniq -c | classificar -bnr | grep fuck

seler
fonte
Pode querer usar tr -spara lidar com vários espaços, especialmente quando encontrar recuo.
Arcege
@ Arccege: Bom ponto. Embora não mude o resultado, ele pode prender um pouco o script.
Seler
-g( --general-numeric-sort) opção de sortpode ser preferível em alguns casos. Por exemplo sort -n, manterá 10\n1 4como está, tratando 1 4como 14, enquanto sort -gtratará corretamente como 1 4\n10.
Skippy le Grand Gourou
bom comando, realmente merecem um voto up :)
Noor
@eler Eu acho que você pode tornar a parte grep e tr ainda mais simples, como abaixo: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrObserve que eu sou iniciante, por isso posso estar errado, sinta-se à vontade para aconselhar.
smc 26/10
8
  1. Divida a entrada em palavras, uma por linha.
  2. Classifique a lista resultante de palavras (linhas).
  3. Squash várias ocorrências.
  4. Classifique por contagem de ocorrências.

Para dividir a entrada em palavras, substitua qualquer caractere que considere um separador de palavras por uma nova linha.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr
Gilles 'SO- parar de ser mau'
fonte
Essa é uma boa resposta, pois pode lidar com o caso em que as palavras estão diretamente próximas a alguma pontuação que não seja da palavra que você deseja ignorar.
David Grayson
5

Não usando grep e awk, mas isso parece fazer o que você deseja:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of
Bram
fonte
1
Isso não funcionará se a entrada contiver caracteres curinga do shell (é necessário adicionar set -f) e tratar a pontuação como parte das palavras (que podem ser corrigidas de maneira desagradável ao adicionar caracteres de pontuação IFS- boa sorte, tentando suportar conjuntos de caracteres não ASCII). Isso não será bom com arquivos de entrada muito grandes, pois ele armazena o arquivo inteiro na memória ( sorté mais inteligente).
Gilles 'SO- stop be evil'
2

Eu acredito que você está atrás de algo assim?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

é claro que você também pode fazer o mesmo awk:)

amitkr
fonte
2

Usando awk/sort/uniqsolução:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
Prince John Wesley
fonte
Lindo! Isso funcionou perfeitamente.
Stidmatt
0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

classifica em ascensão após dividir o arquivo em palavras.

O grep simples será encontrado fishem fisheye, então você precisa aprimorar o comando grep para evitar correspondências parciais.

Demora cerca de 3s para um arquivo de texto de 25k em uma máquina com o passar do tempo, HDD clássico (IDE).

Para arquivos maiores ou operações realizadas com frequência, uma abordagem de mapa de hash seria melhor, mas para um trabalho raramente executado ou apenas para arquivos menores, pode ser suficiente.

Usuário desconhecido
fonte