Encontre em um texto todas as palavras que aparecem 10 ou mais vezes

0

Eu recebo um arquivo txt (war and peace ..), e preciso criar um arquivo de texto classificado alfabeticamente de todas as palavras que aparecem 10 ou mais vezes (sem a quantidade).

A reviravolta nessa questão é que toda pontuação é considerada como um começo de uma nova palavra, ou seja, você é considerado duas palavras, você é.

Eu inverti todas as pontuações em novas linhas e todos os espaços em novas linhas. E eu usei trim -c então agora eu tenho todas as palavras e sua contagem, não sei como mostrar apenas aquelas que aparecem 10 ou mais vezes.

Qualquer ajuda sobre uma maneira de encontrar todas as palavras que aparecem 10 ou mais vezes seria muito apreciada!

    
por Michael Segal 29.11.2016 / 15:44

3 respostas

3
< text tr -cs '[:alnum:]' '[\n*]' |
  awk '++count[$0] == 10' |
  sort

Substitua $0 por tolower($0) se você quiser ignorar o caso.

Que tr analisa s equações de caracteres que são o c omplement do al pha numéricos para ewlines n . awk imprime a décima ocorrência de cada.

Observe que nos sistemas GNU, tr não funciona corretamente em caracteres de vários bytes . No entanto, nesses sistemas, você pode usar a extensão grep do GNU -o em vez disso:

< text grep -Eo '[[:alnum:]]+' |
  awk '++count[$0] == 10' |
  sort

Você pode mudar isso para

< text grep -Eo '[^[:punct:][:space:]]+' |
  awk '++count[$0] == 10' |
  sort

para considerar os caracteres que não são punct uation nem space (ou tr -s '[:punct:][:space:]' '[\n*]' acima para o sistema não-GNU ou texto all-ASCII) que em o texto Guerra e Paz fornece o mesmo resultado.

Note que nos sistemas GNU pelo menos, isso ainda pode dar resultados errados, pois os acentos de combinação Unicode, por exemplo, são classificados como pontuação e não alnums (eles não aparecem nesse texto, embora os caracteres acentuados estejam em sua forma combinada).

    
por 29.11.2016 / 16:17
1

Em perl:

perl -e 'while(<>){while(/([[:alpha:]]+)/g){$c{$&}++}};foreach $w(keys %c){if($c{$w}<10){delete $c{$w}}};foreach $w(sort keys %c){print "$w\n"}' WarAndPeace.txt

Recuado:

perl -e '# Let s count every words
         while(<>){
             while(/([[:alpha:]]+)/g){
                 $c{$&}++
             }
          }
          # Let s remove lesser than 10
          foreach $w(keys %c){
              if($c{$w}<10){
                  delete $c{$w}
              }
          }
          # Let s sort and print
          foreach $w(sort keys %c){
              print "$w\n"
          }' WarAndPeace.txt

Com UTF-8:

 perl -e 'use open qw/:std :utf8/;
          # Let s count every words
             while(<>){
                 while(/([[:alpha:]]+)/g){
                     $c{$&}++
                 }
              }
              # Let s remove lesser than 10
              foreach $w(keys %c){
                  if($c{$w}<10){
                      delete $c{$w}
                  }
              }
              # Let s sort and print
              foreach $w(sort keys %c){
                  print "$w\n"
              }' WarAndPeace.txt
    
por 29.11.2016 / 16:50
1

Caso você já tenha retirado pontos e espaços em branco do arquivo e tenha apenas as palavras nele, conforme mencionado em seus comentários (sem espaços / guias extras em branco), você pode usar sort , uniq e awk para conseguir o que você queria:

sort file_with_words | uniq -c | awk '{ if ($1 >= 10) { print}}'

Minha solução só funciona se o arquivo estiver formatado corretamente (uma palavra / linha, sem espaços / guias extras).

    
por 29.11.2016 / 16:05