搜索一个字符串的匹配的基本代码
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
的字段数:fileA
include.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