2009-07-14 28 views
10

Sto provando a creare un dizionario di parole da una raccolta di file. C'è un modo semplice per stampare tutte le parole in un file, uno per riga?estrarre parole da un file

+0

Avete bisogno di un certo linguaggio di programmazione? – mkmurray

+2

@mkmurray, "shell", "scripting" e "unix" di solito significano uno qualsiasi degli strumenti disponibili sulle caselle standard UNIX: awk, grep, sed, perl, cut e così via. – paxdiablo

risposta

21

Si potrebbe utilizzare grep:

  • -E '\w+' ricerche per parole
  • -o stampa solo la parte della linea che corrisponde
 
% cat temp 
Some examples use "The quick brown fox jumped over the lazy dog," 
rather than "Lorem ipsum dolor sit amet, consectetur adipiscing elit" 
for example text. 
# if you don't care whether words repeat 
% grep -o -E '\w+' temp 
Some 
examples 
use 
The 
quick 
brown 
fox 
jumped 
over 
the 
lazy 
dog 
rather 
than 
Lorem 
ipsum 
dolor 
sit 
amet 
consectetur 
adipiscing 
elit 
for 
example 
text 
 

Se si desidera solo di stampa ogni parola una volta, trascurando il caso, è possibile utilizzare sort

  • -u stampa solo ogni parola una volta
  • -f dice sort di ignorare caso quando si confrontano le parole
 
# if you only want each word once 
% grep -o -E '\w+' temp | sort -u -f 
adipiscing 
amet 
brown 
consectetur 
dog 
dolor 
elit 
example 
examples 
for 
fox 
ipsum 
jumped 
lazy 
Lorem 
over 
quick 
rather 
sit 
Some 
text 
than 
The 
use 
+0

grazie! Sono stato su Google per un'ora per questo. Stranamente, usando "... da un documento" invece di "...da un file di testo "mi ha portato questa domanda come prima corrispondenza – davka

+0

puoi usare ----> grep -o -E '\ w +' testfile.txt | sort -u -f | tee 5.txt <---- per eseguire l'output su un file –

+0

jack yang: o semplicemente utilizzare un normale reindirizzamento della shell 'grep ... | sort -u -f> 5.txt' – rampion

3

Un buon inizio è di utilizzare semplicemente sed sostituire tutti gli spazi con a capo, togliere le righe vuote (di nuovo con sed), quindi sort con il flag -u (uniquify) per rimuovere i duplicati, come in questo esempio:

$ echo "the quick brown dog and fox jumped 
over the lazy dog" | sed 's/ /\n/g' | sed '/^$/d' | sort -u 

and 
brown 
dog 
fox 
jumped 
lazy 
over 
quick 
the 

Quindi puoi iniziare a preoccuparti della punteggiatura e simili.

3

parole assumendo separate da spazi bianchi

awk '{for(i=1;i<=NF;i++)print $i}' file 

o

tr ' ' "\n" < file 

se si desidera che l'unicità:

awk '{for(i=1;i<=NF;i++)_[$i]++}END{for(i in _) print i}' file 

tr ' ' "\n" < file | sort -u 

con alcuni segni di interpunzione rimossi.

awk '{ 
    gsub(/["*^&()#@$,?~]/,"") 
    for(i=1;i<=NF;i++){ _[$i] } 
} 
END{ for(o in _){ print o } }' file 
0

Il comando tr può farlo ...

tr [:blank:] '\n' < test.txt 

Ciò richiede al programma tr di sostituire lo spazio bianco con una nuova riga. L'uscita è stdout, ma potrebbe essere reindirizzato a un altro file, result.txt:

tr [:blank:] '\n' <test.txt> result.txt 

Fare riferimento here.

Problemi correlati