awk中的精确字符串匹配

Exact string match in awk

我有一个文件test.txt,其中包含下一行

1997           100   500   2010TJ
2010TJXML      16    20    59

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

awk -v var="2010TJ" '[=11=] ~ var {print [=11=]}' test.txt

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

1997  100   500   2010TJ

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

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

awk ' == "2010TJ" {print [=10=]}' test.txt

或 grep like(所有列):

gawk '/\<2010TJ\>/ {print [=11=]}' test.txt

备注

\< \> is word boundarys

多个选项:

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

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

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

$ awk '/^2010TJ /' file

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

$ awk '=="2010TJ"' file

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

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

或者,给定您设置变量的示例,同样使用变量:

$ gawk -v s=2010TJ '[=14=]~"\<" s "\>"' 
$ awk -v s=2010TJ '[=14=]~"^" s " "'
$ awk -v s=2010TJ '==s'

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

另一个 awk 有单词边界

awk '/\y2010TJ\y/' file

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