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

在perl中查找与两个文件匹配的部分,perl,Perl,我想写一个Perl程序。第一个输入文件是两列文本。第一列是标签,第二列是搜索字符串。第二个输入文件也有两列。第一列是标签,第二列是要搜索的文本。例如,根据第二列,John(在file1中)与file2中的Johni比John更相似 文件1 文件2 输出 Jami EWWQQQQQQQERRRTTTTTTTTTT Jam WWQQQQQQQERRRTTTTTT Johni AAAAABBBCCCDEEEEEEHHHHHH John AABBBCCCDEE 我尝试了下面的代

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

文件1

文件2

输出

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";}}}
#/user/bin/perl
使用警告;
严格使用;
my($infile1)=$ARGV[0];
my($infile2)=$ARGV[1];

打开(我的$fh1,“这不会像输出那样以相反的顺序打印结果。我不确定这是否是有意的。如果您愿意,可以将结果存储在数组中并反转或排序。您的示例非常有限,这只是对您尝试执行的操作的最佳估计

#!/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";
   }
}
!/usr/bin/perl
使用警告;
严格使用;
my($infile1)=$ARGV[0];
my($infile2)=$ARGV[1];
我的$search_file=“”;

“打开(我的$fh2)”,听起来像是在寻找某个相当复杂的字符串比较算法,如果你想选择“最佳匹配”。@TLP我是指第二列中的最佳匹配。因此,在每种情况下,文件1中的一行都是文件2中的一行的子集吗?@Jeef是的,就是这样correct@MaryamSani“最佳匹配”您是指相同类型的匹配,其中一个字符串是另一个字符串的子字符串?您可能应该对此进行详细说明,因为听起来您提供的信息太少。该函数可用于查找字符串
$pinder
中出现的子字符串
$haystack
索引($haystack,$pinder)>=0
@chansen是的,但使用正则表达式获取子字符串所在的整行似乎更容易。然后,在使用函数或
\Q…\E
表达式将字符串插入正则表达式时,应引用/转义任何元字符。@chansen谢谢。我没有考虑到这一点,因为作为一个快速散列,但现在添加了它。
#!/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";}}}
#!/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";
   }
}