我有一个如下所示的输入文件:
>Seq_1;1
AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1
CCCCCCCCCCCCCCCCCCCCC
还有更多这样的成对线。 我想要做的就是像这样打印出来:
>Seq_1;1 AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1 CCCCCCCCCCCCCCCCCCCCC
但为什么这段代码失败了:
#!/usr/bin/perl -w
while ( <> ) {
chomp;
my $line = $_;
my $rdn = "";
my $sq = "";
if ( $line =~ /^>/ ) {
$rdn = $line;
}
elsif ($line =~ /^[ATCG]/) {
$sq = $line;
}
print "$rdn $sq\n";
}
它打印出来:
>Seq_1;1
AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1
CCCCCCCCCCCCCCCCCCCCC
答案 0 :(得分:2)
由于您的数据是“成对”的,除非您想明确检查每行所描述的模式,为什么不一次只读两行?然后进行处理:
#!/usr/bin/perl
use strict;
use warnings;
while (my $line1 = <>) {
my $line2 = <>;
chomp $line1;
chomp $line2;
# ...do_something...
print "$line1 $line2\n";
}
结果:
>Seq_1;1 AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1 CCCCCCCCCCCCCCCCCCCCC
答案 1 :(得分:1)
这个awk可以成功:
$ awk '/^>/ {getline a; print $0,a}' file
它在变量a
中加载以>
开头的那一行。然后一起打印。
$ cat file
>Seq_1;1
AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1
CCCCCCCCCCCCCCCCCCCCC
$ awk '/^>/ {getline a; print $0,a}' file
>Seq_1;1 AAAAAAAAAAAAAAAAAAAAA
>Seq_2;1 CCCCCCCCCCCCCCCCCCCCC
答案 2 :(得分:1)
因为您是逐行读取文件并在每行打印? 你可能想要更像这样的东西。在第一次迭代中存储第一行的值,然后在第二次交互中将其打印出来。请注意,此代码绝不是最好的,就好像您的文件与上面发布的文件不完全一样,几乎肯定会打印出错误的内容。
#!/usr/bin/perl -w
my $rdn = "";
while ( <> ) {
chomp;
my $line = $_;
if ( $line =~ /^>/ ) {
$rdn = $line;
next;
}
elsif ($line =~ /^[ATCG]/) {
my $sq = $line;
print "$rdn $sq\n";
}
}
答案 3 :(得分:1)
在每次迭代中,您都设置$rdn
或$sq
,而不是两者都设置。然后你打印它们(其中一个总是“”),最后加上\n
。
试试这个,想法只是在\n
如果它是偶数行的情况下扼杀它,在这种情况下打印一个空格:
my $lineno = 0;
while (<>) {
if ($lineno % 2 == 0) {
chomp;
print $_, " ";
} else {
print;
}
$lineno++;
}