搜索字符串列表

时间:2015-09-08 14:47:28

标签: linux

我在文件A中有值

301310
304790
500011
600462
607348
614269

我想在文本文件B中搜索所有这些值,其中包含类似

的行
1.35|10|5|11|1p36.31|GPR153|P|G protein-coupled receptor 153||614269|REc|||| | |4(Gpr153)|
1.36|3|24|06|1p36.31|HES2|P|Hairy/enhancer of split, Drosophila, homolog of, 2||609970|REc|||| | ||
1.37|3|24|06|1p36.31|HES3|P|Hairy/enhancer of split, Drosophila, homolog of, 3||609971|REc|||| | ||
1.38|3|24|06|1p36.33|HES4|P|Hairy/enhancer of split, Drosophila, homolog of, 4||608060|REc|||| | ||
1.39|3|24|06|1p36.32|HES5|P|Hairy/enhancer of split, Drosophila, homolog of, 5||607348|REc|||| | ||

我想打印包含文件A中任何一个术语的所有行,并将它们打印在输出文件中。

我尝试了以下命令,但它无法正常工作

grep -w -F -f fileA fileB >file C

2 个答案:

答案 0 :(得分:0)

如果你的grep不工作那么可能是一个perlish解决方案? 虽然我会指出 - 鉴于你的数据示例,没有找到匹配,这可能是问题的一部分。

#!/usr/bin/perl

use strict;
use warnings;
open ( my $file1, '<', "FileA" ) or die $!; 

my @search_for = <$file1>; 
close ( $file1 );

my $search_regex = join ( "|", map {quotemeta} @search_for ); 
   $search_regex = qr/$search_regex/; 

open ( my $file2, '<', "fileB" ) or die $!; 
while ( <$file2> ) {
   print if m/$search_regex/;
}
close ( $file2 );

如果您想确保没有空行:

my $search_regex = join ( "|", grep { m/^\w+$/ } map {quotemeta} @search_for ); 
   $search_regex = qr/$search_regex/;

答案 1 :(得分:0)

当您发布问题时,您的文件是这样的:

301310

304790

500011

我编辑了格式的帖子,并删除了空行,认为这只是你编辑错误的编辑。如果您的输入文件实际 中有空行,您将要删除它们,因为grep会将它们解释为&#34;匹配空模式&#34;,它匹配每个线。它等同于:

grep "" fileB

所以,只需擦除fileA中的空行,你发布的grep命令应该可以正常工作。