嘿,我仍然是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
答案 0 :(得分:3)
您可以使用-v
的{{1}}选项,而无需使用grep
:
sed
grep -vFf 2.txt 1.txt
答案 1 :(得分:3)
您可以使用以下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
中,则显示当前行。