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