我有两个文件: 文件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
但是我无法获得测试中的其他部分。有什么建议来解决这个问题吗?
答案 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更改内容。我只是将操作分组以允许对整个结果进行排序或其他后期操作