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

时间:2018-11-26 11:17:07

标签: 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 | xargs -I {} sed -n "/{}/p" 1.txt

2 个答案:

答案 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中,则显示当前行。