如何在Perl中解析成对数据时转义额外的空行

时间:2013-06-03 09:38:54

标签: linux perl unix

我有一个如下所示的输入文件:

>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

4 个答案:

答案 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++;
}