Awk sed删除2个文件之间匹配的行

Awk sed删除2个文件之间匹配的行,awk,sed,Awk,Sed,嘿,我还是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 |

嘿,我还是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
您可以使用grep的-v选项,无需使用sed:

您可以使用grep的-v选项,无需使用sed:


您可以使用以下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表示仅在处理作为awk参数提供的第一个文件时执行以下操作。 黑名单[$2]使用当前行中的域名在数组黑名单中注册一个密钥。 下一个意思是跳到下一行。 !$2在黑名单中表示如果当前行中的域名在数组黑名单中不存在,则打印当前行。
您可以使用以下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表示仅在处理作为awk参数提供的第一个文件时执行以下操作。 黑名单[$2]使用当前行中的域名在数组黑名单中注册一个密钥。 下一个意思是跳到下一行。 !$2在黑名单中表示如果当前行中的域名在数组黑名单中不存在,则打印当前行。
一个更好的选择可能是使用w而不是F,否则example.com可能与example.company.de匹配。我没带,就考了。@break-The-wA的用法更好的选择可能是使用w而不是F,否则example.com可能会与example.company.developer匹配。我没带,就考了。@中断了-w的用法
awk -F '[@:]' 'NR == FNR { blacklist[$2]; next } !($2 in blacklist)' 2.txt 1.txt