【问题标题】:sed delete lines matching pattern between 2 filessed删除2个文件之间匹配模式的行
【发布时间】:2018-11-26 20:50:12
【问题描述】:

嘿,我仍然是 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

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    您可以使用以下 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 中不存在,则打印当前行。

    【讨论】:

      【解决方案2】:

      你可以使用grep-v选项,不需要使用sed

      grep -vFf 2.txt 1.txt
      

      demo3@example.nl:foo
      

      【讨论】:

      • 更好的选择可能是使用w 而不是F 否则example.com 可以匹配example.company.de
      • 刚刚注意到了。我在没有@ 的情况下进行了测试。 @ 打破了-w 的用法