Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk从一个文件中搜索另一个文件中的多单词模式_Bash_Design Patterns_Awk - Fatal编程技术网

Bash 使用awk从一个文件中搜索另一个文件中的多单词模式

Bash 使用awk从一个文件中搜索另一个文件中的多单词模式,bash,design-patterns,awk,Bash,Design Patterns,Awk,模式文件: wicked liquid movie guitar balance transfer offer drive car 大文件: wickedliquidbrains drivelicense balanceofferings 在命令行上使用awk: awk '/balance/ && /offer/' bigfile 我得到了我想要的结果 balanceofferings awk '/wicked/ && /liquid/' bigfile

模式文件:

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变量时,包含那些“/regex1/&&/regex2/”。。等等,到awk

awk -v search="$out" '$0 ~ search' "$bigfile"
awk不运行。。有什么问题吗?

试试这个:

awk "$out" "$bigfile"
当执行
$0~搜索
时,
搜索
的值必须是正则表达式。但是您将它设置为一个字符串,其中包含一组regexp,它们之间有
&&
,这不是一个有效的regexp

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

awk "$out"' { /* do stuff */ }' "$bigfile"
我将操作从双引号切换为单引号,以防操作使用带有
$

的awk变量。请尝试以下操作:

awk "$out" "$bigfile"
当执行
$0~搜索
时,
搜索
的值必须是正则表达式。但是您将它设置为一个字符串,其中包含一组regexp,它们之间有
&&
,这不是一个有效的regexp

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

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

我将操作从双引号切换为单引号,以防操作使用awk变量并更新了
$

Barmars解决方案的另一种选择是使用
-v
传递参数:

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

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

输出:

one
wickedliquidbrains
如果要读取pattern_文件并对所有行进行匹配,可以尝试以下操作:

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
在第1行,它读取模式文件并将其存储在2D数组中
re
。每行包含拆分的输入字符串。每行的第0个元素是该行的长度。
然后读取
bigfile
。测试
bigfile
的每一行是否与
re
数组匹配。如果一行中的所有项目都匹配,则打印该行。

已更新

Barmars解决方案的另一种选择是使用
-v
传递参数:

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

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

输出:

one
wickedliquidbrains
如果要读取pattern_文件并对所有行进行匹配,可以尝试以下操作:

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
在第1行,它读取模式文件并将其存储在2D数组中
re
。每行包含拆分的输入字符串。每行的第0个元素是该行的长度。

然后读取
bigfile
。测试
bigfile
的每一行是否与
re
数组匹配。如果一行中的所有项目都匹配,则会打印该行。

谢谢Barmar,尽管我自己发现它是一样的。。几分钟前:)),无论如何,我还是不明白为什么变量传递方法不起作用。干杯它不起作用,因为
/foo/&&&/bar/
不是正则表达式。它不只是将值替换到行中,而是将其用作表达式中的值。我现在如何将其浓缩到其中,以显示匹配的行号。。所以应该是/foo/&&/bar/{print NR,$0},但是如何在bash脚本中连接它们。谢谢你。。它起作用了。。我在“$out”和“$out”之后没有看到空格{谢谢Barmar,尽管我自己发现它是一样的。.几分钟前:)),但无论如何,我还是不明白为什么变量传递方法不起作用。干杯!它不起作用,因为
/foo/&&&/bar/
不是正则表达式。它不只是将值替换到行中,而是将其用作表达式中的值。我该如何合作ncat现在进入这一步,以显示有匹配项的行号..它应该是/foo/&&/bar/{print NR,$0},但如何在bash脚本中对它们进行concate。Thankstorry..它起作用..我在“$out”和'{但是那样的话,你不能同时用&&&&传递两个正则表达式,这是我问题的主要任务,或者你可以?@branquito:当然,你可以!你可以
&&
|
任意数量的
匹配
函数。我扩展了我的答案。是的,但是你可以看到,将它们作为shell变量传递的原因是它们是相反的从数组元素开始,逐行从文件中读取,所以..有时会有两个,有时三个也许四个..所以我所做的是,我读取行,通过单词将它们放到一个数组中,然后通过数组中的&&将它们连接在一起,这样我就得到了/word1/&/word2/等等ow一个shell变量,其中包含一个字符串,表示应该作为规则传递给awk的内容。也许我现在更清楚了。无论如何,我喜欢你的解决方案,因为它对其他一些情况很有用。谢谢!@branquito:问题是你的问题不是那样。你接受了一个不能真正解决你问题的答案。我的原创性l answer只是这个答案的一个扩展。但是如果我理解你的需要,这个脚本会满足你的需要。但是那样的话,你就不能同时用&&&&传递两个正则表达式,这是我问题的主要任务,或者你可以?@branquito:当然可以!你可以&和
|
匹配任何数量的
函数。我扩展了我的回答是这样的,但是你知道把它们作为shell变量传递的原因是它们是从数组元素构造的,当逐行从文件中读取时,所以..有时会有两个,有时可能有三个或四个..所以我做的是,我读取行,通过单词将它们分成一个数组,而不是通过它数组并将它们连接在一起,中间加上&&,这样我就得到了/word1/&&&/word2/等等。所有这些现在都是一个shell变量,其中包含一个字符串,表示应该作为规则传递给awk的内容。也许我现在更清楚了。无论如何,我喜欢你的解决方案,因为它对其他一些情况非常有用。谢谢!@branquito:问题是你的问题不是那样的。你接受了一个不能真正解决你问题的答案。