Shell 使用另一个文件中的搜索键搜索一个文件的内容

Shell 使用另一个文件中的搜索键搜索一个文件的内容,shell,scripting,grep,Shell,Scripting,Grep,我有两个文件: 文件1: 文件2: neo.com example.com abc.gov.uk 文件2是要在文件1中搜索的搜索键如果在文件1中找到任何搜索键,则应返回带有搜索键的文件1行,否则仅返回文件1的行,如下所示: hello.com neo.com, example.com news.net example2.com abc.gov.uk 我试过这个: grep -F -f file2 file1 我得到的结果是 hello.com neo.com,j

我有两个文件: 文件1:

文件2:

neo.com
example.com
abc.gov.uk
文件2是要在文件1中搜索的搜索键如果在文件1中找到任何搜索键,则应返回带有搜索键的文件1行,否则仅返回文件1的行,如下所示:

hello.com    neo.com, example.com 
news.net     
example2.com    abc.gov.uk
我试过这个:

grep -F -f file2 file1
我得到的结果是

hello.com   neo.com,japan.com,example.com
example2.com    earth.net, abc.gov.uk

但我无法得到测试的其他部分。有没有解决这个问题的建议?

您可以使用shell脚本来获得所需的结果

#!/bin/bash
while read -r lineA <&3 read -r lineB <&4
do
   line=`echo "$lineA" | grep "$lineB"`
   if [ -n "$line" ] ; then
     echo "$lineA";
   else
     echo `echo $lineA | sed 's/\([^ ]*\).*/\1/g'`
   fi
done 3<1.txt 4<2.txt
#/bin/bash
而读r-lineA

第一个(f)grep获取包含引用的信息,第二个获取另一个并更改内容。我只是将操作分组,以允许对整个结果进行排序或其他后期操作

如果需要保持初始顺序,此awk one liner可以帮助:

awk 'NR==FNR{a[NR]=$0;next}
     {l=$1;for(x in a)if($0~a[x]){l=$0;break}print l}' file2 file1
根据测试数据,它输出:

hello.com   neo.com,japan.com,example.com
news.net
example2.com    earth.net, abc.gov.uk

请注意,可能有一个问题,我在一行程序中进行了正则表达式匹配检查,如果您的文件2中的内容是域,则可以在将它们添加到数组
a[NR]之前转义
(点)

它的工作原理令人惊讶,但另一个问题是,如果我需要检索与搜索数据匹配的测试数据,那么如何调整上面的awk代码。例如:上面的注释被弄乱了:-(我想检索与搜索键匹配的行,例如hello.com neo.com example.com,而不是不在搜索键中的其他行,如果不匹配,我想检索上述情况下的列,如news)。net@MohanTimilsina尝试将
l=$0
更改为
sub(/^[^]*+/,”);l=$0
我尝试了以下方法:awk'NR==FNR{a[NR]=$0;next}{l=$1;for(a中的x)if($0~a[x]){sub(/^[^]*+/,“”);l=$0;break}print l}'第一行仍然显示japan.com,因为它不在搜索键中,也不显示example2.com,但显示abc.gov.uk,但我需要example2.com abc.gov.ukalso@MohanTimilsina我以为你想要那个值。你能编辑你的问题,给出输入和输出吗?在那里你可以更好地控制格式。
awk 'NR==FNR{a[NR]=$0;next}
     {l=$1;for(x in a)if($0~a[x]){l=$0;break}print l}' file2 file1
hello.com   neo.com,japan.com,example.com
news.net
example2.com    earth.net, abc.gov.uk