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

时间:2014-07-29 12:14:51

标签: shell scripting grep

我有两个文件: 文件1:

hello.com   neo.com,japan.com,example.com
news.net    xyz.com, telecom.net, highlands.net, software.com
example2.com    earth.net, abc.gov.uk

文件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

但是我无法获得测试中的其他部分。有什么建议来解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

如果需要保留初始订单,这个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中有东西是域,则可以在将.(dot)添加到数组a[NR]之前将其转义{{1}}

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

{
 fgrep -f file2 file1
 fgrep -v -f file2 file1 | sed 's/ .*//'
}

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