0

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

>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

4 回答 4

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
于 2013-06-03T10:24:08.990 回答
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
于 2013-06-03T09:43:10.687 回答
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";
        }    
    }
于 2013-06-03T09:43:15.917 回答
1

在每次迭代中,您设置一个$rdn$sq,从不设置两者。然后你打印它们(其中一个总是“”),\n最后带有 a 。

\n试试这个,想法是只在它是偶数行时切掉,在这种情况下打印一个空格:

my $lineno = 0;
while (<>) {
   if ($lineno % 2 == 0) {
      chomp;
      print $_, " ";
   } else {
      print;
   }
   $lineno++;
}
于 2013-06-03T09:51:06.340 回答