Text Bash:grep从文件中选择的文本

Text Bash:grep从文件中选择的文本,text,awk,sed,grep,Text,Awk,Sed,Grep,我有两个文件,文件1: abc/def/ghi/ss/sfrere/sfs xyz/pqr/sef/ert/wwqwq/bh 文件2: ind abc def bcf pqr sss 我希望grep file1中的文本文件,这样file2的任何一行上的任何单词都与file1的一行匹配,所以在这种情况下,答案将是第一行,因为abc和def出现在file1的第一行中。在文件2的任何一行中,来自flie 1行的2个或多个单词都应该匹配。这应该可以做到 awk 'FNR==NR{a[$1];next

我有两个文件,文件1:

abc/def/ghi/ss/sfrere/sfs
xyz/pqr/sef/ert/wwqwq/bh
文件2:

ind abc def
bcf pqr sss

我希望grep file1中的文本文件,这样file2的任何一行上的任何单词都与file1的一行匹配,所以在这种情况下,答案将是第一行,因为abc和def出现在file1的第一行中。在文件2的任何一行中,来自flie 1行的2个或多个单词都应该匹配。

这应该可以做到

awk 'FNR==NR{a[$1];next}{for(i in a){c=0;for(j=1;j<=NF;j++){if(index(i,$j)>0)c++}if(c>=2)print i}}' file1.txt file2.txt
awk'FNR==NR{a[$1];next}{for(i in a){c=0;for(j=1;j0)c++}如果(c>=2)print i}file1.txt file2.txt
解释

FNR==NR{a[$1];next}
将迭代第一个
File1.txt
并将行存储在
a

for(a中的i)
将循环通过上述存储行

c=0
只是为了进行数字检查以跟踪匹配的列数

对于(j=1;j0)c++
如果
File2.txt
中的一列在
File1.txt
的行中,则递增计数器

如果(c>=2)print i
您给定的条件是它至少应该匹配2列,那么我们将从
File1.txt
打印行


这是我能想到的最直截了当的方法,我相信有更疯狂的方法可以做到这一点。

在巨大的文件中

sed 's/\([^ ]*\) \([^ ]*\) \([^ ]*\)/(\1.*\2)|(\2.*\1)|(\1.*\3)|(\3.*\1)|(\2.*\3)|(\3.*\2)/' file2 >/tmp/file2.egrep
egrep -f /tmp/file2.egrep file1
rm >/tmp/file2.egrep

基于文件2内容为egrep创建临时模式匹配

pqr出现在第2行中,那么为什么不希望输出中出现第2行?sss和bcf都不在第二行中,三行中的两行应该在第二行中,所以要匹配文件1中的一行,文件2中的一行中必须至少存在两个字?或者正好是两个字,还是三个字也可以??请将这些详细信息添加到问题中。3也可以,多于2应该匹配。如果来自文件2的单词在文件1的一行中出现两次,会发生什么情况?那行应该打印出来吗?@NooB8374你能告诉我它到底在打印什么吗?