以下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
之前和之后匹配任何内容。
答案 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