我想写一个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";}}}
答案 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";
}
}