【问题标题】:How to delete a line if the occurrence of a string is exactly once per line?如果字符串的出现每行恰好一次,如何删除一行?
【发布时间】:2019-08-25 07:38:33
【问题描述】:

我需要在同一行中删除包含一个字符串的所有行。如果找不到匹配项或者即使字符串匹配两次,我也会保留该行。

我正在尝试删除包含字符串“priority”的行,并且仅当该字符串每行仅出现一次时。无论如何可以使用 awk 或 sed 来做吗?此命令未提供所需的输出 awk -F'priority' 'NF==1' filename

输入文件:

shopping_priority+brands,baby_priority_brands

shopping_priority+brands,baby_shopping_brands

men_shopping_local,women_shopping_local

预期输出:

shopping_priority+brands,baby_priority_brands
men_shopping_local,women_shopping_local

更新: 现在我想检查多个单词而不是 "priority" 。例如,我还想检查{priority,women,shopping},如果“priority”或“women”或“shopping”在一行中只出现一次,则删除该行。稍后可以扩展要检查的单词列表。

输入:

shopping_priority+brands,baby_priority_brands

shopping_priority+brands,baby_shopping_brands

men_shopping_local,women_shopping_local

pla%20electronics_bfhrg_shopping,pla_electronics_shopping

现在我的预期输出应该是:

pl%20electronics_bfhrg_shopping,pla_electronics_shopping

【问题讨论】:

    标签: linux awk sed grep


    【解决方案1】:

    应该这样做:

    awk -F"priority" 'NF!=2' file
    shopping_priority+brands,baby_priority_brands
    men_shopping_local,women_shopping_local
    

    通过将字段分隔符设置为priority,所有带有一个priority 的行将有两个字段。 NF!=2打印所有没有priority的行

    【讨论】:

    • @jww OP 想要删除只有一个优先级的记录,所以这也适用于三个优先级
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed '/priority/{s//&/2;t;d}' file
    

    如果一行包含所需的字符串,并且在同一行中至少存在两次,则删除该行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2019-12-17
      • 1970-01-01
      • 2013-01-04
      • 2011-11-18
      • 2011-12-19
      • 2018-03-11
      相关资源
      最近更新 更多