0

模式文件:

wicked liquid
movie
guitar
balance transfer offer
drive car

大文件:

wickedliquidbrains
drivelicense
balanceofferings

在命令行上使用 awk:

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

我得到了我想要的结果

balanceofferings

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

给我

wickedliquidbrains, which is also good..


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

不给我驾照,这也很好,因为我有 &&

现在,当尝试将 shell 变量传递给 awk..

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

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

4

2 回答 2

2

试试这个:

awk "$out" "$bigfile"

当您这样做时$0 ~ search, 的值search必须是正则表达式。但是您将它设置为一个包含一堆正则表达式的字符串,&&它们之间存在 - 这不是一个有效的正则表达式。

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

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

如果操作使用 awk 变量和$.

于 2013-05-31T01:20:06.243 回答
1

更新

Barmars 解决方案的替代方案,其参数通过以下方式传递-v

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

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

于 2013-05-31T08:08:48.823 回答