【问题标题】:AWK print if found three matches, one false如果找到三个匹配项,则 AWK 打印一个错误
【发布时间】:2017-11-01 11:35:33
【问题描述】:

文件中有几行如下所示:

A   B   C   H
A   B   C   D

并且,我想打印包含此 RE 的所有行:

/A\tB/

但是,如果该行在第四个字段中包含和H,则不要打印,输出将是:

A   B   C   D

可以sed、awk、grep写成一行?

我唯一知道的是:

awk '/^A\tB/'

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:

    这将起作用:

    awk '$1$2 == "AB" && $4 != "H"' file
    

    如果所有条目都是单个字符,这也可以:

    awk '$1$2$3$4 ~ /^AB.[^H]/' file
    

    【讨论】:

      【解决方案2】:

      使用 awk 单行:

      awk -F'\t' '$1=="A" && $2=="B" && $4!="H"' file
      
      • -F'\t' - 制表符 \t 被视为字段分隔符

      输出:

      A   B   C   D
      

      【讨论】:

        【解决方案3】:

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

        sed  '/^A\tB\t.\t[^H]/!d' file
        

        如果一行不包含AB、任何字符以及H以外的其他字符,并用制表符分隔,则将其删除。

        可以写成:

         sed  -n '/^A\tB\t.\t[^H]/p' file
        

        【讨论】:

          【解决方案4】:

          使用这个。

          awk '/^A\tB/ { if ( $4 != "H" ) print }'
          

          【讨论】:

          • 错字,' 应该在最后一个 } 之后...可以简化并为第二列 awk '/^A\tB\t/ && $4 != "H"' 提供更强大的匹配
          • @Sundeep 好的。谢谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-30
          • 2019-11-11
          • 1970-01-01
          • 2022-10-17
          • 2017-06-30
          • 1970-01-01
          • 2015-05-03
          相关资源
          最近更新 更多