awk 中的精确字符串匹配

Fre*_*fqh 0 awk gawk

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

1997           100   500   2010TJ
2010TJXML      16    20    59
Run Code Online (Sandbox Code Playgroud)

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

awk -v var="2010TJ" '$0 ~ var {print $0}' test.txt
Run Code Online (Sandbox Code Playgroud)

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

1997  100   500   2010TJ
Run Code Online (Sandbox Code Playgroud)

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

daw*_*awg 5

几种选择:

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

$ gawk '/\<2010TJ\>/' file
Run Code Online (Sandbox Code Playgroud)

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

$ awk '/^2010TJ /' file
Run Code Online (Sandbox Code Playgroud)

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

$ awk '$1=="2010TJ"' file
Run Code Online (Sandbox Code Playgroud)

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

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

或者,给出设置变量的示例,使用变量相同:

$ gawk -v s=2010TJ '$0~"\\<" s "\\>"' 
$ awk -v s=2010TJ '$0~"^" s " "'
$ awk -v s=2010TJ '$1==s'
Run Code Online (Sandbox Code Playgroud)

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