awk中的精确字符串匹配

时间:2017-10-23 23:13:10

标签: awk gawk

我有一个带有下一行的文件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

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

3 个答案:

答案 0 :(得分:0)

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

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

或grep like(所有列):

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

注意

\< \> is word boundarys

答案 1 :(得分:0)

有几个选择:

使用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'

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

答案 2 :(得分:0)

另一个带有字边界的awk

awk '/\y2010TJ\y/' file

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