2011-09-07 14 views
7

Chcę użyć grep razem z plikiem stopwords do odfiltrowania popularnych angielskich słów z innego pliku. Plik "somefile" zawiera jedno słowo w linii.Użycie polecenia grep do odfiltrowania słów z pliku stopwords

cat somefile | grep -v -f stopwords 

Problem z tym podejściem jest: Sprawdza, czy słowo w stopwords występuje w somefile, ale chcę przeciwieństwo, czyli sprawdzić, czy słowo w somefile występuje w stopwords.

Jak to zrobić?

Przykład

somefile zawiera następujące:

hello 
o 
orange 

stopwords zawiera następujące elementy:

o 

chcę odfiltrować tylko słowo "O" z somefile, nie cześć i pomarańczowo.

Odpowiedz

14

Myślałem o tym trochę więcej, i znalazł rozwiązanie ...

użyć przełącznika -w z grep dopasować całe słowa:

grep -v -w -f stopwords somefile 
+1

lub 'grep -v -w -f stopwords somefile' omijając komendę' cat' – Matthias

+1

Zmieniłem odpowiedź na podstawie Twojej sugestii czyszczenia @Matthias –

5

Zakładając masz odrzucanych słów pliku/tmp/słowa:

in 
the 

można utworzyć z niego sed programu przez:

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

ten sposób dostaniesz /tmp/words.sed:

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

a następnie użyć go do cenzurowania dowolnego pliku tekstowego:

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

The -e jest potrzebna dla sed do zrozumienia rozszerzony wyrażenie regularne potrzebne do rozpoznania. Oczywiście możesz zmienić [censored] na dowolny inny łańcuch lub pusty łańcuch, jeśli chcesz.

To rozwiązanie obsłuży wiele słów w linii oraz jedno słowo na pliki liniowe.

Powiązane problemy