2010-10-20 4 views
4

Любители прекрасного дня!оболочка для фильтрации запрещенных слов по файлу

в основном у меня есть два файла:

frequency.txt: (несколько строк, разделенных пробелами файл, содержащий слова и частоты)

de 1711 
a 936 
et 762 
la 530 
les 482 
pour 439 
le 425 
... 

и у меня есть файл, содержащий «запрещенные» слова :

stopwords.txt: (одна строка, разделенных пробелом файл)

au aux avec le ces dans ... 

, поэтому я хочу, чтобы удалить из frequency.txt все строки, содержащие слово найдены на stopwords.txt

, как я мог бы сделать это? Я думаю, что это можно сделать с awk .. что-то вроде

awk 'match($0,SOMETHING_MAGICAL_HERE) == 0 {print $0}' frequency.txt > new.txt 

но я не совсем уверен ... любые идеи? thxs заранее

ответ

3
tr ' ' '\n' < stopwords.txt | grep -vwFf - frequency.txt 

-w к grep имеет решающее значение, например, чтобы избежать le в stopwords.txt с удалением слов, содержащих le, таких как less или little.

+0

yeap ... вы играете. Мне нужен был '-w'. Awk от @ ghostdog74 тоже работает, но с использованием grep выглядит чище – pleasedontbelong

5

Это будет делать это для вас:

tr ' ' '\n' <stopwords.txt | grep -v -w -F -f - frequency.txt 

-v, чтобы инвертировать матч
-w для целого слова соответствует только
-F является, чтобы указать, что модель представляет собой набор из новой строки отделившейся фиксированных строк
-f, чтобы получить строки шаблона из файла stopwords.txt

Если у вас есть проблемы с этим, потому что это разделителями пространства, вы можете использовать тр заменить пробела с новой строкой:

+0

И выкиньте там '-F', чтобы сделать его более быстрым (и избежать проблем, если какие-либо слова содержат'. 'Или другие необычные символы). –

+1

Стоп-слова находятся в одной строке и -f ожидает, что они будут на отдельных строках. – codaddict

+0

, который не будет работать, поскольку стоп-слова - это одна строка с пробелом. – ghostdog74

6
$ awk 'FNR==NR{for(i=1;i<=NF;i++)w[$i];next}(!($1 in w))' stop.txt freq.txt 
de 1711 
a 936 
et 762 
la 530 
les 482 
pour 439 
+0

hey thxs ... кажется, работает – pleasedontbelong

+2

Nice. Вы явно * мастер AWK. –

+0

@ Dan: Правильно сказал :) +1 к вам и +1 к мастеру. – codaddict

2
join -v1 <(sort frequency.txt) <(tr ' ' '\n' <stopwords.txt|sort) | sort -k2,2rn 
Смежные вопросы