2011-09-07 7 views
7

Quiero usar grep junto con un archivo de palabras vacías para filtrar las palabras comunes en inglés de otro archivo. El archivo "somefile" contiene una palabra por línea.Usar grep para filtrar palabras de un archivo de palabras vacías

cat somefile | grep -v -f stopwords 

El problema con este enfoque es: Se comprueba si una palabra en palabras vacías se produce en somefile, pero quiero lo contrario, es decir, comprobar si una palabra en somefile se produce en palabras vacías.

¿Cómo hacer esto?

Ejemplo

somefile contiene los siguientes:

hello 
o 
orange 

palabras vacías contiene lo siguiente:

o 

quiero filtrar sólo la palabra "o" de somefile, no hola y naranja

Respuesta

14

lo pensé un poco más, y encontré una solución ...

usar el interruptor de -wgrep para que coincida con las palabras completas:

grep -v -w -f stopwords somefile 
+1

o 'grep -v -w -f stopwords somefile' evitando el comando' cat' – Matthias

+1

He cambiado la respuesta en función de su sugerencia de limpieza @Matthias –

5

Asumiendo que tiene palabras vacías archivo/tmp/palabras:

in 
the 

se puede crear a partir de ella el programa de sed por:

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

esta manera obtendrá /tmp/words.sed:

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

y luego utilizarlo para censurar cualquier archivo de texto:

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

El -e se necesita para la SED para entender extendida expresiones regulares necesarias para el reconocimiento. Por supuesto, puede cambiar [censored] a cualquier otra cadena o cadena vacía si lo desea.

Esta solución manejará muchas palabras en línea, así como archivos de una palabra por línea.

Cuestiones relacionadas