Use a linha de comando para imprimir o número de palavras únicas

0

Eu tenho um pouco de lição de casa:

Find how many unique words and their count in the file alice? Print the sorted unique words to a file named alice_unique. Be careful, that when you split words with apostrophes they split correctly, same with any other special character.

Eu tenho isso até agora,

tr -sc 'A-Za-z' '2' < alice | sort | uniq -c > alice_unique

mas eu não sei como manter as palavras com caracteres especiais (',!,?, etc) juntos. Ou como contar o número de palavras únicas no total.

Arquivo de Texto Alice (Início do mesmo)

ALICE'S ADVENTURES IN WONDERLAND

Lewis Carroll

THE MILLENNIUM FULCRUM EDITION 3.0

CHAPTER I. Down the Rabbit-Hole

Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, 'and what is the use of a book,' thought Alice 'without pictures or conversation?'

So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her.

    
por K. Mart 03.02.2017 / 04:35

2 respostas

1
<alice tr -cd "[:alpha:][:space:]-'" |
  tr ' [:upper:]' '\n[:lower:]' |
  tr -s '\n' |
  sed "s/^['-]*//;s/['-]$//" |
  sort |
  uniq -c > alice_unique

Linha por linha:

  • Remova tudo, exceto letras, espaços em branco, apóstrofos e hifens
  • Transforme espaços em novas linhas e converta maiúsculas em minúsculas
  • "Apertar" novas linhas consecutivas
  • Retirar apóstrofos e hifens iniciais ou finais
  • Classifique as palavras
  • Mostrar cada palavra única com uma contagem de quantas vezes ocorreu

Se você deveria contar números como palavras, isso está errado. Se o texto não for ASCII, isso pode não funcionar. Para Alice no País das Maravilhas é provavelmente bom o suficiente.

    
por 03.02.2017 / 05:58
1

Tente isso, onde está o arquivo de texto:

awk -- '{for (i = 1; i <= NF; i++) wc[$i] += 1}; END {for (w in wc) print w, wc[w]}' <file> | sort

Edit: Desculpe, eu fiz isso com pressa, e não expliquei. Por padrão, o awk divide cada linha de entrada no espaço em branco, produzindo campos $ 1, $ 2, ..., até NF, que fornece uma contagem do número de campos de entrada. Também itera sobre todas as linhas de entrada implicitamente. A tag END dá um bloco de código a ser executado depois que todas as linhas são processadas. As variáveis não são declaradas e os colchetes são usados para referenciar matrizes associativas.

Este programa awk está pegando cada palavra de cada linha, usando essa palavra como um índice em wc [], e adicionando a contagem (que é tratada como zero se ainda não definida). Portanto, o loop for e o loop externo implícito em todas as linhas contam todas as palavras únicas (a pontuação fará com que seja contada como uma palavra diferente, mas isso é facilmente corrigido, se desejado). O bloco END, em seguida, imprime todas as palavras e suas contagens.

Eu usei um pipe para classificar as palavras em ordem, em vez de complicar o programa awk. Eu também acabei de remover o "-u" que eu tinha anteriormente, já que cada linha será única.

    
por 03.02.2017 / 05:25