【问题标题】:Exact string match in awkawk 中的精确字符串匹配
【发布时间】:2017-10-23 23:13:10
【问题描述】:

我有一个包含下一行的文件 test.txt

1997           100   500   2010TJ
2010TJXML      16    20    59

我正在使用下一个 awk 行仅获取有关字符串 2010TJ 的信息

awk -v var="2010TJ" '$0 ~ var {print $0}' test.txt

但是代码打印了这两行。我想知道如何获取包含确切字符串的行

1997  100   500   2010TJ

字符串可以放在文件的任何列中。

【问题讨论】:

    标签: awk gawk


    【解决方案1】:

    几个选项:

    使用gawk 字边界(不是POSIX awk...):

    $ gawk '/\<2010TJ\>/' file
    

    实际的空格或制表符或分隔列的内容:

    $ awk '/^2010TJ /' file
    

    或者直接将字段与字符串进行比较:

    $ awk '$1=="2010TJ"' file
    

    如果您愿意,您可以遍历字段以测试每个字段:

    $ awk '{for (i=1;i<=NF;i++) if ($i=="2010TJ") {print; next}}' file
    

    或者,给定你设置变量的例子,那些使用变量的例子:

    $ gawk -v s=2010TJ '$0~"\\<" s "\\>"' 
    $ awk -v s=2010TJ '$0~"^" s " "'
    $ awk -v s=2010TJ '$1==s'
    

    请注意,第一个与第二个和第三个略有不同。第一个是$0 中任意位置的独立字符串2010TJ;第二个和第三个是一个以该字符串开头的字符串。

    【讨论】:

      【解决方案2】:

      试试这个(仅用于测试第 1 列):

      awk '$1 == "2010TJ" {print $0}' test.txt
      

      或像 grep 一样(所有列):

      gawk '/\<2010TJ\>/ {print $0}' test.txt
      

      注意

      \< \> is word boundarys
      

      【讨论】:

      • 如果字符串不在第一个字段中 2010TJ 100 500 200 2010TJXML 16 20 59
      【解决方案3】:

      另一个带有单词边界的awk

      awk '/\y2010TJ\y/' file
      

      注意\y 匹配单词的开头或结尾。

      【讨论】:

        最近更新 更多