sed удаляет строки, соответствующие шаблону между двумя файлами - PullRequest
0 голосов
/ 26 ноября 2018

Эй, я все еще новичок в sed, и я пытаюсь использовать скрипт sed, чтобы выводить только строки, не найденные из 1.txt в 2.txt, если в строке есть / pattern /.У меня есть следующее:

1.txt
demo@example.de:boo
demo2@example.com:foo
demo3@example.nl:foo

2.txt
@example.de
@example.com

Желаемый вывод будет

demo3@example.nl:foo

Я пробовал эти команды выглядит не работает

$ grep -f 2.txt 1.txt
$ cat 2.txt | xargs -I {} sed -n "/{}/p" 1.txt

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы можете сделать это, используя следующую команду awk.

awk -F '[@:]' 'NR == FNR { blacklist[$2]; next } !($2 in blacklist)' 2.txt 1.txt

Объяснение:

  • -F '[@:]' сообщает awk, что поля во входных строках разделенына @ или :.(demo@example.com:foo -> $1 = demo, $2 = example.com, $3 = foo)
  • NR == FNR <action> означает выполнение следующего действия только при обработке первого файла, указанного в качестве аргумента для awk.
  • blacklist[$2] регистрирует ключ в массиве blacklist с именем домена в текущей строке.
  • next означает переход к следующей строке.
  • !($2 in blacklist) означает печать текущей строкиесли доменное имя в нем не существует в массиве blacklist.
0 голосов
/ 26 ноября 2018

Вы можете использовать -v вариант grep, не нужно использовать sed:

grep -vFf 2.txt 1.txt

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