如何匹配awk中模式前后的任何内容?

时间:2014-04-06 01:29:57

标签: regex bash csv awk

以下awk代码在$find的第2列中搜索file.csv,并输出在第一个匹配行的第1列中找到的数据:

awk -v pattern="$find" '$2 ~ pattern { print $1; exit }' file.csv

,例如file.csv

1,panda
2,zebra
3,bobcat
4,lion
5,cat

如果$find设置为“cat”,则会打印“5”。

这似乎仅匹配单元格的整个内容,类似于^cat$中的grep

如何调整它以便它首次找到文本出现在单元格内的某个位置,例如,如果$find设置为“cat”,则会打印“3”,因为“bobcat”包含单词“猫”。换句话说,如果在单元格中的某个位置找到匹配,而不是匹配CSV中的整个单元格,就足够了。

  • 只输出第一场比赛。

我尝试了以下操作,但它们没有按预期工作:

awk -v pattern="*$find*" '$2 ~ pattern { print $1; exit }' file.csv

我在AWK Language Programming - Regular Expressions找不到任何指示,以便在awk之前和之后匹配任何内容。

2 个答案:

答案 0 :(得分:4)

不应该。您使用的是csv文件,但未将字段分隔符设置为,

以下是您期望的输出:

$ cat file.csv
1,panda
2,zebra
3,bobcat
4,lion
5,cat
$ find=cat
$ awk -F, -v pattern="$find" '$2 ~ pattern { print $1; exit }' file.csv
3

对于完全匹配,请使用==代替~

$ awk -F, -v pattern="$find" '$2==pattern { print $1; exit }' file.csv
5

答案 1 :(得分:3)

除了JS解释的另外一种方法是以非正则表达方式执行此搜索,以便搜索字符串可能包含特殊正则表达式字符的情况是使用index函数:

find='cat'
awk -F, -v pattern="$find" 'index($2, pattern) { print $1; exit }' file.csv
3