Obtém contagem de ocorrências de palavra de arquivo de texto de todas as palavras e saída de impressão ordenada

23

Eu tinha um comando que funcionava através de um arquivo de texto, contava todas as ocorrências das palavras e as imprimia assim:

remy@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 faz isso para todas as palavras, não apenas para uma palavra. Eu encontrei em algum lugar nos internets há muito tempo atrás, mas não consigo encontrar nem me lembrar disso ..

    
por LocalHost 20.05.2012 / 08:12

6 respostas

26

Eu usaria tr em vez 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*$" reduz as linhas vazias
  • sort para preparar como entrada para uniq
  • uniq -c para contar ocorrências
  • sort -bnr classifica em ordem inversa numérica ignorando espaço em branco

uau. acabou por ser um grande comando para contar Jure-por-linhas

find . -name "*.py" -exec cat {} \; | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr | grep fuck

    
por 20.05.2012 / 13:46
6
  1. Divida a entrada em palavras, uma por linha.
  2. Classifique a lista resultante de palavras (linhas).
  3. Atingir várias ocorrências.
  4. Classificar por contagem de ocorrências.

Para dividir a entrada em palavras, substitua qualquer caractere que você considera 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
    
por 21.05.2012 / 01:58
5

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

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
    
por 20.05.2012 / 10:55
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ê pode fazer o mesmo com awk também:)

    
por 20.05.2012 / 09:58
1

Usando awk/sort/uniq solution:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr
    
por 20.05.2012 / 18:54
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 ascendente após dividir o arquivo em palavras.

O simples grep encontrará fish em fisheye , então você precisa melhorar o comando grep para evitar correspondências parciais.

Leva cerca de 3s para um arquivo de texto de 25k em uma máquina das idades, HDD clássico (IDE).

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

    
por 21.05.2012 / 18:27

Tags