1

Считайте, что у меня есть два текстовых файла.

Имя первого файла - «Emails.txt» со следующими данными:

00iiiiiiii_l@hotmail.com
00rrrrrrrr@hotmail.com
00zzzzz@gmail.com
00eeeeee@gotmail.com
00gggggg@uor.edu
00uuuuuuuu@yahoo.com
00e21_ss@cmail.com
00gggggggg@cmail.com
00zzzzzzzz48@hotmail.com
00aaaaaaa_2020@gotmail.com
jjjjjjjj@gmail.com

Второй текстовый файл - «Banned.txt» со следующими строками:

@gotmail.com
@cmail.com
@uor.edu

Как удалить все строки в 1-м текстовом файле «Emails.txt», если он совпадает со строками любой строки, присутствующей во втором текстовом файле «Banned.txt»?

Желаемый вывод нового файла должен быть:

00iiiiiiii_l@hotmail.com
00rrrrrrrr@hotmail.com
00zzzzz@gmail.com
00uuuuuuuu@yahoo.com
00zzzzzzzz48@hotmail.com
jjjjjjjj@gmail.com

Можно ли это сделать с помощью SED или awk в Linux? Подскажите, пожалуйста, как это сделать?

1 ответ1

1

grep -v достаточно. Флаг -f позволяет вам делать именно то, что вы хотите:

grep -vf Banned.txt Emails.txt

Если вы хотите сделать что-то более сложное из списка запрещенных адресов, например, навязать, чтобы они соответствовали всему домену, вам нужно сгенерировать регулярное выражение из вашего Banned файла:

cat Banned.txt | tr "\n" "|" | sed -e 's,|,$\\|,g' | sed -e 's,\\|$,,'

дает желаемое

@gotmail.com$\|@cmail.com$\|@uor.edu$

Затем:

cat Banned.txt | tr "\n" "|" | sed -e 's,|,$\\\\|,g' | sed -e 's,\\|$,,' | xargs -i grep -v '{}' Emails.txt

(удвоение количества выходов \ поскольку они оцениваются при прохождении xargs). Это будет соответствовать и удалять me@uor.edu но не, например, me@uor.education.gov .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .