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:问题是你的问题不是那样的。你接受了一个不能真正解决你问题的答案。