【问题标题】:Removes values in a file that match patterns from another file [duplicate]删除文件中与另一个文件中的模式匹配的值[重复]
【发布时间】:2015-09-15 15:26:56
【问题描述】:

我在一个文件中有一个值列表:

item2
item3
item4

当行看起来像这样时,我想从另一个文件中删除整行:

item1|XXXX|ABCD
item2|XXXX|ABCD
item3|XXXX|ABCD
item4|XXXX|ABCD
item5|XXXX|ABCD

所以我只剩下:

item1|XXXX|ABCD
item5|XXXX|ABCD

是否有bash 序列来执行此操作?

【问题讨论】:

    标签: bash unix


    【解决方案1】:

    grep -vf 可以胜任:

    grep -vFf file1 file2
    item1|XXXX|ABCD
    item5|XXXX|ABCD
    

    【讨论】:

      【解决方案2】:

      求救!

      $ awk -F"|" 'NR==FNR{a[$1];next} !($1 in a)' remove items
      item1|XXXX|ABCD
      item5|XXXX|ABCD
      

      要删除的项目列表在文件“remove”中,数据在文件“items”中

      【讨论】:

        【解决方案3】:

        如果您的独特标记是|XXXX|ABCD| 字符串,您可以直接将grep 输出:

        $ grep -vF '|XXXX|ABCD|' input > output
        

        使用选项-F(固定字符串)更安全,因为您的模式非常接近包含正则表达式元字符(即在您的情况下:|—它在默认的 grep 正则表达式语法中不活动,但您不当您使用简单的模式时,不想担心这一点)。

        如果您的独特模式是该行的其余部分,您可以使用整个文件作为带有grep-f 选项的模式列表:

        $ grep -vFf item_list < input > output
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-17
          • 2021-11-01
          • 2011-06-03
          • 1970-01-01
          • 2016-07-08
          • 2019-06-25
          • 1970-01-01
          相关资源
          最近更新 更多