Para um tempo de codificação mais rápido, isto é o que eu tento com sucesso agora:
printf '%s\n' $(cat *.txt) | sort | uniq -c | sort -gr | less
Digamos que eu tenha um monte de arquivos de texto contendo ficção, não-ficção, artigos de jornal, & c (exemplos aleatórios de texto em um determinado idioma.)
Eu quero uma lista de frequência das palavras dadas, a palavra mais comum primeiro.
Eu poderia escrever algum código em C para fazer isso, mas se houver uma maneira mais rápida de fazer isso, eu gostaria de saber. (Quando digo mais rápido, quero dizer tempo de codificação, não tempo de execução).
Para um tempo de codificação mais rápido, isto é o que eu tento com sucesso agora:
printf '%s\n' $(cat *.txt) | sort | uniq -c | sort -gr | less
Escrever em C provavelmente terá um tempo de execução rápido, mas demora mais para escrever. Um bom compromisso pode ser usar o awk:
tally.awk
FNR == NR { pat[$1] = 1; next }
{
for(p in pat)
if(index($0, p))
pat[p]++
}
END {
for(p in pat)
print pat[p]-1, p
}
Isso primeiro lerá em uma lista de palavras (uma palavra por linha) e, em seguida, contará as correspondências encontradas no restante da entrada. Corra assim:
cat *.txt | awk -f tally.awk wordlist - | sort -nr
As opções acima também serão compatíveis com substrings, se você quiser corresponder palavras inteiras, substitua a linha index
por:
if(match($0, "\<" p "\>"))
Você pode fazer (com o GNU grep):
grep -hEo "[[:alnum:]_'-]+" ./*.txt | sort | uniq -c | sort -rn
Altere [:alnum:]_'-
acima para o que deve ser constituinte das palavras.
Tags text-processing