awk部分字符串匹配(如果列/字部分匹配)

PoG*_*bas 68 awk

我的虚拟文件如下所示:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman
Run Code Online (Sandbox Code Playgroud)

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

awk '($3=="snow" || $3=="snowman") {print}' dummy_file
Run Code Online (Sandbox Code Playgroud)

但应该有更简单的方法.

Ahm*_*sud 127

awk '$3 ~ /snow/ { print }' dummy_file 
Run Code Online (Sandbox Code Playgroud)

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

Thu*_*eef 32

也可以通过使用index()函数查找substring:

awk '(index($3, "snow") != 0) {print}' dummy_file
Run Code Online (Sandbox Code Playgroud)

更短的版本:

awk 'index($3, "snow")' dummy_file
Run Code Online (Sandbox Code Playgroud)

  • 这比Ahmed Masud的回答更好,因为它将"snow"作为文字字符串处理,而不是正则表达式. (6认同)
  • 你可以写得更简单:`awk'索引($ 3,"snow")'dummy_file` (6认同)
  • 我同意这比我的答案更好。 (2认同)

Ahm*_*udh 7

也许这会有所帮助

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

awk '$3 ~ /snow|snowman/' dummy_file
Run Code Online (Sandbox Code Playgroud)


Chr*_*our 5

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

awk '$3~/^snow(man)?$/' file
Run Code Online (Sandbox Code Playgroud)