使用awk从另一个文件中搜索多字模式

时间:2013-05-31 00:49:54

标签: bash design-patterns awk

模式文件:

wicked liquid
movie
guitar
balance transfer offer
drive car

bigfile文件:

wickedliquidbrains
drivelicense
balanceofferings

在命令行上使用awk:

awk '/balance/ && /offer/' bigfile

我得到了我想要的结果

balanceofferings

awk '/wicked/ && /liquid/' bigfile  

给了我

wickedliquidbrains, which is also good..


awk '/drive/ && /car/' bigfile

不给我drivelicense也很好,因为我有&&

现在尝试传递shell变量时,包含'/ regex1 /&& / regex2 / ..等'到awk ..

awk -v search="$out" '$0 ~ search' "$bigfile"

awk没有运行..可能是什么问题??

2 个答案:

答案 0 :(得分:2)

试试这个:

awk "$out" "$bigfile"

执行$0 ~ search时,search的值必须是正则表达式。但是你将它设置为一个字符串,其中包含一堆在它们之间带有&&的正则表达式 - 这不是一个有效的正则表达式。

要对匹配的行执行操作,请执行:

awk "$out"' { /* do stuff */ }' "$bigfile"

如果操作使用带有$的awk变量,我会从双引号切换到单引号。

答案 1 :(得分:1)

<强>已更新

使用-v传递参数的Barmars解决方案的替代方案:

awk -v search="$out" 'match($0,search)' "$bigfile"

测试:

$ echo -e "one\ntwo"|awk -v luk=one 'match($0,luk)'
one

将两个(真实)正则表达式(ERE)传递给

echo -e "one\ntwo\nnone"|awk -v re1=^o -v re2=e$ 'match($0,re1) && match($0,re2)'

输出:

one

如果你想读取pattern_file并匹配所有行,你可以尝试这样的事情:

awk 'NR==FNR{N=NR;re[N,0]=split($0,a);for(i in a)re[N,i]=a[i];next}
{
  for(i=1;i<=N;++i) {
    #for(j=1;j<=re[i,0]&&match($0,re[i,j]);++j);
    for(j=1;j<=re[i,0]&&$0~re[i,j];++j);
    if(j>re[i,0]){print;break}
  }
}' patterns_file bigfile

输出:

wickedliquidbrains

在第1行,它读取并将pattern_file存储在2D数组re中。每行包含拆分输入字符串。每行的第0个元素是该行的长度。 然后它会显示bigfile。测试bigfile的每一行是否匹配re数组。如果一行中的所有项目都匹配,则打印该行。