在perl中找到部分匹配的两个文件

时间:2014-02-18 01:25:14

标签: perl

我想写一个Perl程序。第一个输入文件是2列文本。第一列是标签,第二列是搜索字符串。第二个输入文件也有2列。第一列是标签,第二列是要搜索的文本。例如,根据第二列,John(在file1中)与文件2中的Johni比John更相似。

文件1

John AABBBCCCDEE
Jam  WWQQQQQQQERRRTTTTTT

file2的

Jami    EWWQQQQQQQERRRTTTTTTTTTT
Johni   AAAAABBBCCCDEEEEEEHHHHHH
Mark    WWWCCVVVVVVFFFFFFFTTTTTT
ROB     ##@@@########VVVVVVVVVVV
John    WWADFRWSSSSSSDDDDDqqqqqq

输出

Jami    EWWQQQQQQQERRRTTTTTTTTTT    Jam  WWQQQQQQQERRRTTTTTT
Johni   AAAAABBBCCCDEEEEEEHHHHHH    John AABBBCCCDEE

我尝试了以下代码,但它不能按我想要的方式工作。

#!/user/bin/perl
use warnings;
use strict;

my ($infile1) = $ARGV[0];
my ($infile2) = $ARGV[1];
open(my $fh1, "<$infile1");

while(my $file1 = <$fh1> ){

my @file1 = split ("\t| ", $file1);
my $name_file1 = $file1[0];
my $ID_file1 = $file1[1];
my @matchline_file2 = `cat $infile2 | grep $name_file1`;
for my $ID_file1 (@file1){
        if (grep my $ID_file2 eq $ID_file1, @matchline_file2){
        print "found\n";}else{print "not_found\n";}}}

1 个答案:

答案 0 :(得分:1)

这不会像输出那样以相反的顺序打印结果。我不确定这是否是故意的。您可以将结果存储在数组中,并根据需要对订单进行反向或排序。你的例子非常有限,这只是你想要做的最好的估计。

#!/usr/bin/perl
use warnings;
use strict;

my ($infile1) = $ARGV[0];
my ($infile2) = $ARGV[1];

my $search_file = "";
open(my $fh2, "<$infile2");

while(my $line = <$fh2>)
{
   $search_file .= $line;
}

open(my $fh1, "<$infile1");

while(my $line = <$fh1>)
{
   chomp($line);

   if($line =~ m/\w+\s+(.*)/)
   {
       my $search_string = quotemeta("$1");

       if($search_file =~ m/(.*$search_string.*)/)
       {
          print "$1\t$line\n";
       }
       else
       {
          print "Could not find: $line\n";
       }
   }
   else
   {
      print "Invalid line: $line\n";
   }
}
相关问题