Проверьте, содержит ли каждая строка в файле одну из нескольких строк в другом файле. - PullRequest
0 голосов
/ 25 августа 2018

У меня есть текстовый файл (назовем его keywords.txt), который содержит несколько строк, разделенных символами новой строки (хотя это не указано в камне; я могу разделить их пробелами, запятыми или чем-то еще наиболее подходящий). У меня также есть ряд других текстовых файлов (которые я в совокупности назову input.txt).

Что я хочу сделать, так это перебрать каждую строку в input.txt и проверить, содержит ли эта строка одно из ключевых слов. После этого, в зависимости от того, с каким входным файлом я сейчас работаю, мне нужно будет либо скопировать совпадающие строки в input.txt в output.txt и игнорировать несовпадающие строки, либо скопировать несовпадающие строки и игнорировать сопоставление.

Я искал решение, но, хотя я нашел способы сделать части того, что я пытаюсь сделать, я не нашел способа сделать все, что я прошу здесь. Несмотря на то, что я мог попытаться объединить различные решения, которые я нашел, моя главная проблема заключается в том, что я в конечном итоге задаюсь вопросом, будет ли то, что я кодировал, лучшим способом сделать это.

Это фрагмент того, что у меня есть в keywords.txt:

google
adword
chromebook.com
cobrasearch.com
feedburner.com
doubleclick
foofle.com
froogle.com
gmail
keyhole.com
madewithcode.com

Вот пример того, что можно найти в одном из моих input.txt файлов:

&expandable_ad_
&forceadv=
&gerf=*&guro=
&gIncludeExternalAds=
&googleadword=
&img2_adv=
&jumpstartadformat=
&largead=
&maxads=
&pltype=adhost^

В этом фрагменте &googleadword= - единственная строка, которая будет соответствовать фильтру, и в моем случае есть сценарии, в которых output.txt либо вставит только совпадающую строку, либо каждую строку, которая не соответствует ключевым словам.

1 Ответ

0 голосов
/ 25 августа 2018

1. Предполагая, что содержимое keywords.txt отделено новыми строками:

google
adword
chromebook.com
...

Будет работать следующее:

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ff keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vFf keywords.txt input.txt > output.txt

2. Предполагая, что содержимое keywords.txt разделено вертикальными чертами:

google|adword|chromebook.com|...

Будет работать следующее:

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -Ef keywords.txt input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vEf keywords.txt input.txt > output.txt

3. Предполагая, что содержимое keywords.txt разделено запятыми:

google,adword,chromebook.com,...

Есть много способов добиться того же, но простым способом было бы использовать tr, чтобы заменить все запятые вертикальными чертами, а затем интерпретировать шаблон с помощью расширенного регулярного выражения grep.

# Use keywords.txt as your pattern & copy matching lines in input.txt to output.txt
grep -E $(tr ',' '|' < keywords.txt) input.txt > output.txt

# Use keywords.txt as your pattern & copy non-matching lines in input.txt to output.txt
grep -vE $(tr ',' '|' < keywords.txt) input.txt > output.txt

Опции Grep

 -v, --invert-match
       Selected lines are those not matching any of the specified patterns.   

 -F, --fixed-strings
       Interpret each data-matching pattern as a list of fixed strings, 
       separated by newlines, instead of as a regular expression.

 -E, --extended-regexp
       Interpret pattern as an extended regular expression
       (i.e. force grep to behave as egrep).

 -f file, --file=file
       Read one or more newline separated patterns from file.
       Empty pattern lines match every input line.
       Newlines are not considered part of a pattern.
       If file is empty, nothing is matched.

Подробнее о grep

Подробнее о tr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...