2011-09-07 18 views
7

Desidero utilizzare grep insieme a un file stopwords per filtrare le parole inglesi comuni da un altro file. Il file "somefile" contiene una parola per riga.Uso di grep per filtrare le parole da un file stopword

cat somefile | grep -v -f stopwords 

Il problema di questo approccio è: Verifica se una parola in stopword si verifica in somefile, ma voglio il contrario, vale a dire controllare se una parola in somefile si verifica in stopword.

Come fare questo?

Esempio

somefile contiene i seguenti:

hello 
o 
orange 

stopwords contiene i seguenti:

o 

voglio filtrare solo la parola "o" da somefile, non ciao e arancione.

risposta

14

Ci ho pensato un po ', e ho trovato una soluzione ...

utilizzare l'interruttore -w di grep per abbinare parole intere:

grep -v -w -f stopwords somefile 
+1

o 'grep -v -w -f stopword somefile' evitando il comando' cat' – Matthias

+1

Ho modificato la risposta in base al suggerimento di pulizia @Matthias –

5

Supponendo di avere stopword file/tmp/parole:

in 
the 

è possibile creare da esso programma sed da:

sed 's|^|s/\\<|; s|$|\\>/[CENSORED]/g;|' /tmp/words > /tmp/words.sed 

questo modo otterrete /tmp/words.sed:

s/\<in\>/[CENSORED]/g; 
s/\<the\>/[CENSORED]/g; 

e quindi utilizzarlo per censurare qualsiasi file di testo:

sed -e -f /tmp/words.sed /input/file/to/filter.txt > /censored/output.txt 

Il -e è necessario per sed per capire esteso regexp necessario per il riconoscimento. Ovviamente è possibile modificare [censored] in qualsiasi altra stringa o stringa vuota, se lo si desidera.

Questa soluzione gestirà molte parole in linea e un file word per linea.

Problemi correlati