想在fasta文件中将随机字符串添加到标识符行

时间:2015-02-12 23:20:16

标签: perl random add identifier fasta

我想在fasta文件中将随机字符串添加到现有标识符行。 所以我得到了:

MMETSP0259|AmphidiniumcarteCMP1314aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

然后下一行的序列正常。我想在格式输出中有问题。这就是我得到的:

MMETSP0259|AmphidiniumCMP1314aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
CTTCATCGCACATGGATAACTGTGTACCTGACTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
TCTGGGAAAGGTTGCTATCATGAGTCATAGAATaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac

它被添加到每一行。 (我改变了长度以适应这里。)我只想添加标识符行。

这是我到目前为止所做的:

use strict;
use warnings;
my $currentId = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

my $header_line;
my $seq;
my $uniqueID;

open (my $fh,"$ARGV[0]") or die "Failed to open file: $!\n";
open (my $out_fh, ">$ARGV[0]_longer_ID_MMETSP.fasta");

while( <$fh> ){
    if ($_ =~ m/^(\S+)\s+(.*)/) {
        $header_line = $1;
        $seq = $2;
        $uniqueID = $currentId++;
        print $out_fh "$header_line$uniqueID\n$seq";
    } # if
} # while

close $fh;
close $out_fh;

非常感谢,任何想法都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您的程序无效,因为正则表达式^(\S+)\s+(.*)匹配输入文件中的每一行。例如,\S+匹配CTTCATCGCACATGGATAACTGTGTACCTGACT;该行末尾的换行符与\s+匹配;并且没有匹配.*

以下是我对您的解决方案进行编码的方式。它只是将$current_id附加到包含管道|字符

的任何行的末尾
use strict;
use warnings;
use 5.010;
use autodie;

my ($filename) = @ARGV;

my $current_id = 'a' x 57;

open my $in_fh,  '<', $filename;
open my $out_fh, '>', "${filename}_longer_ID_MMETSP.fasta";

while ( my $line = <$in_fh> ) {
    chomp $line;
    $line .= $current_id if $line =~ tr/|//;
    print $line, "\n";
}

close $out_fh;

<强>输出

MMETSP0259|AmphidiniumCMP1314aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
CTTCATCGCACATGGATAACTGTGTACCTGACT
TCTGGGAAAGGTTGCTATCATGAGTCATAGAAT