每条记录有4行:
如下所示:
@NCYC36111a03.q1k bases 1 to 1576
GCGTGCCCGAAAAAATGCTTTTGGAGCCGCGCGTGAAAT
+
!)))))****(((***%%((((*(((+,**(((+**+,
有两个文件,其中1个文件对应另一个
有一系列seqeunce A1 因此,从文件1一次读取1条记录。从文件2读取记录。如果记录1文件1(第2行)中的序列与数组A1中的seuqnece匹配,则将文件2中的记录打印到输出文件等等...但重点是我需要一次读取一条记录....我将如何突破内部循环,以便我可以从文件1中读取下一条记录,然后将其与下一条记录进行比较文件2
答案 0 :(得分:1)
答案 1 :(得分:1)
如果只有相同数字的行匹配,则实际上不需要多个循环。您可以在任何地方呼叫阅读操作(<>
,read
,sysread
)。它通常只直接放在循环中,因为它可以方便地返回undef并在工作完成后将其中断。
while(defined(my $first_line = <FIRST>)){
my $second_line = <SECOND>;
if($first_line eq $second_line){
print "match\n";
} else {
print "no match\n";
}
}
答案 2 :(得分:1)
从你的句子我需要检查序列是否与来自第二个的序列匹配,我想要检查两个文件中的任何行是否匹配?
如果您需要多次阅读文件,那么您可以使用seek
快退到它的开头,而无需重新打开它。
这个程序显示了这个想法。
use strict;
use warnings;
open my $fh1, '<', 'file1' or die $!;
open my $fh2, '<', 'file2' or die $!;
open my $out, '>', 'matches' or die $!;
while (my $line1 = <$fh1>) {
seek $fh2, 0, 0;
while (my $line2 = <$fh2>) {
if ($line1 eq $line2) {
print $out $line1;
last;
}
}
}
修改强>
您的评论改变了问题。这两个文件都有四行记录,您希望比较两个文件中相应记录中的第二行。
use strict;
use warnings;
open my $fh1, '<', 'file1' or die $!;
open my $fh2, '<', 'file2' or die $!;
open my $match, '>', 'matches' or die $!;
open my $nomatch, '>', 'nomatch' or die $!;
while (1) {
my (@data1, @data2);
for (1 .. 4) {
my $line;
$line = <$fh1>;
push @data1, $line if defined $line;
$line = <$fh2>;
push @data2, $line if defined $line;
}
last unless @data1 == 4 and @data2 == 4;
if ($data1[1] eq $data2[1]) {
print $match @data2;
}
else {
print $nomatch @data2;
}
}
答案 3 :(得分:0)
一个完整的例子:
#!/usr/bin/env perl
use strict;
use warnings;
open F1, "<", "/path/1";
open F2, "<", "/path/2";
@a1 = <F1>;
@a2 = <F2>;
for (0..$#a1) {
if ($a1[$_] eq $a2[$_]) {
print "MATCH line [$_]\n";
} else {
print "DOESN'T MATCH line [$_]\n";
}
}