【问题标题】:awk partly string match (if column/word partly matches)awk 部分字符串匹配(如果列/单词部分匹配)
【发布时间】:2013-06-04 19:23:58
【问题描述】:

我的虚拟文件如下所示:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

如果 $3 中有字符串snow,我想获取行。我可以这样做:

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

但应该有更简单的方法。

【问题讨论】:

    标签: awk


    【解决方案1】:

    也许这会有所帮助

    http://www.math.utah.edu/docs/info/gawk_5.html

    awk '$3 ~ /snow|snowman/' dummy_file
    

    【讨论】:

      【解决方案2】:
      awk '$3 ~ /snow/ { print }' dummy_file 
      

      【讨论】:

      • 严格来说不需要打印:'$3~/snow/' 就够了
      • 遗憾的是该链接已经失效:这是当前链接shop.oreilly.com/product/9781565924277.do
      • 使用!所以例如awk '$3 !~ /foo/'
      • 如何打印匹配字符串的行号。我的意思是,假设 /String/ 位于第 80 行,我想获取行号。谢谢。
      • {print NR,$0} 将打印“记录/行号”并匹配整行。警告,假设您只将一个文件名传递给 awk。如果您将文件列表作为参数提供给 awk 命令,则需要确保您使用的是 GNU awk,并将 NR 更改为 FNR 以获得正确的行号。
      【解决方案3】:

      仅打印第三个字段为 snowsnowman 的行:

      awk '$3~/^snow(man)?$/' file
      

      【讨论】:

        【解决方案4】:

        GNU sed

        sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file
        

        输入:

        C1 C2 C3 1 一场雪 2 b 雪人 雪 c 母猪 雪雪雪人

        ..输出:

        1 一场雪 2 b 雪人

        【讨论】:

        • 对于一个非常直截了当的问题,这再复杂不过了。
        • 另外,将sed 用于整个单词是非常危险的。尽管在技术上是可行的,但为了使其可靠地工作,我不得不使用后视、前瞻以及!? 构造,当涉及到应该跟随的词时。这对胆小的人来说没什么,这是肯定的。 (并且容易出现可能会花费大量时间来查找和修复它们的错误。)
        【解决方案5】:

        也可以通过 index() 函数查找子字符串:

        awk '(index($3, "snow") != 0) {print}' dummy_file
        

        短版:

        awk 'index($3, "snow")' dummy_file
        

        【讨论】:

        • 这比 Ahmed Masud 的回答要好,因为它将“雪”作为文字字符串处理,而不是作为正则表达式。
        • 你可以写得更简单:awk 'index($3, "snow")' dummy_file
        • 我同意这比我的回答要好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2020-10-16
        • 2013-10-28
        • 1970-01-01
        • 2019-10-18
        • 2017-07-02
        • 1970-01-01
        相关资源
        最近更新 更多