匹配另一个文件中的至少两个模式

匹配另一个文件中的至少两个模式

搜索一个字符串的匹配的基本代码

cat fileA | grep -Fwf include.txt

我们如何使用代码来匹配 include.list 中的至少两个模式

file A 
data1 khc001 khc002 vp005
data1 fbc001 cs004 khc001

include.txt
khc001
khc002

正确的输出行1:data1 khc001 khc002 vp005

在下面的例子中,仅列出了 2 个模式,但该列表包含更多模式,这就是为什么awk '/pattern1/ && /pattern2/'不合适的原因。

答案1

使用 来做到这一点相当容易,计算每行上等于文件中字符串awk的字段数:fileAinclude.txt

awk 'NR == FNR { p[$1]; next }
     {
         c = 0
         for (i = 1; i <= NF; ++i) if ($i in p) c++
         if ( c >= 2 ) print
     }' include.txt fileA

首先读取include.txt文件并使用单词作为关联数组中的键。然后,它读取第二个文件,对于每一行,它迭代字段并测试每个字段以查看它是否与任何键匹配。

对于每场比赛,我们都会增加一个计数器,如果计数器最后等于或大于 2,我们就会打印该行。


对于喜欢“单调”的人来说,代码的另一种表述方式是:

awk 'NR==FNR {p[$1];next} {c=0;for (i=1;i<=NF;++i) if ($i in p) c++} c>=2' include.txt fileA

答案2

假设模式的顺序与输入文件中的顺序相同但顺序不错误,这应该可以工作:

grep -F " $(tr '\n' ' ' <patterns)" infile

答案3

我能够通过以下 grepception 来完成此任务:

grep -Fwf <(grep -v $(grep -oFwf include.txt fileA | head -1) include.txt) fileA

这将从中删除其中一个匹配模式include.txt并确保至少存在另一个匹配项。

答案4

grep -Fwonf include.txt file_A | 
uniq | 
cut -d: -f1 | 
printf '%dp\n' $(uniq -d) | 
ed -s file_A 

测试

文件内容(file_A测试比较​​复杂):

$ tail -n +1 -- file_A include.txt 
==> file_A <==
data1 khc001 khc002 vp005
data1 fbc001 cs004 khc001
data1 khc001 khc001 vp005
data1 khc002 khc001 vp005

==> include.txt <==
khc001
khc002

输出

data1 khc001 khc002 vp005
data1 khc002 khc001 vp005

相关内容