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


83

我的虚拟文件如下所示:

C1    C2    C3    
1     a     snow   
2     b     snowman 
snow     c     sowman

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

awk '($3=="snow" || $3=="snowman") {print}' dummy_file

但是应该有更简单的方法。

Answers:


157
awk '$3 ~ /snow/ { print }' dummy_file 

27
严格来说,不需要打印:'$3~/snow/'足够
SheetJS 2013年

2
遗憾的是,该链接已经失效:这是当前链接shop.oreilly.com/product/9781565924277.do
Stedy

你的模式是“雪”,而如果有特殊符号,如[\“在我的情况下,指数()是一个更好的解决方案。
邱扬帆

有否办法取消支票?我知道我们可以使用“下一个”代替“打印”并打印其他所有内容,但是只需检查指令少的内容即可
-Sahas

5
使用 !因此,例如awk'$ 3!〜/ foo /'
艾哈迈德·马苏德

41

也可以通过使用index()函数查找子字符串来实现:

awk '(index($3, "snow") != 0) {print}' dummy_file

较短的版本:

awk 'index($3, "snow")' dummy_file

7
这比Ahmed Masud的回答要好,因为它将“ snow”作为文字字符串而不是正则表达式来处理。
jarno 2015年

6
您可以编写得更简单:awk 'index($3, "snow")' dummy_file
jarno 2015年

2
我同意这比我的回答更好。
艾哈迈德·马苏德


8

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

awk '$3~/^snow(man)?$/' file

2

GNU sed

sed '/\s*\(\S\+\s\+\)\{2\}\bsnow\(man\)\?\b/!d' file

输入:

C1 C2 C3    
1个雪   
2 b雪人 
雪人苏曼
      雪雪雪人

..输出:

1个雪
2 b雪人

9
对于一个非常直接的问题,这可能不是一个更复杂的答案。
山姆

1
另外,使用sed整个单词非常冒险。尽管从技术上来说是可行的,但要使该功能可靠地工作,我不得不使用后向,前向以及涉及!?应该使用的单词的构造。没关系,这是肯定的。(并且容易出错,可能会花费大量时间来查找和修复它们。)
语法错误
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.