在fasta文件中将标识符行名称更改为随机缩写的名称

时间:2015-01-25 18:52:27

标签: perl random identifier short fasta

我有一个fasta文件,里面有大约8,000个序列。我需要将标识符行名称更改为随机唯一缩短名称(最大长度为10)。 fasta文件包含这样的序列。

>AX039539.1.1212 Bacteria;Chloroflexi;Dehalococcoidia;Dehalococcoidales;
GAUGAACGCUAGCGGCGUGCCUUAUGCAUGCAAGUCGAACGGUCUUAAGCAAUUAAGAUAGUGGCAAACGGGUGAGUAACGCGUAAGUAACCUACCUCUAAGUGGGGGAUAGCUUCGGGAAACUGAAGGUAAUACCGCAUGUGGUGGGCCGACAUAAGUUGGUUCACUAAAGCCGUAAGGUGCUUGGUGAGGGGCUUGCGUCCGAUUAGCUAGUUGGUGGGGUAACGGCCUACCAAGGCUUCGAUCGGUAGCUGGUCUGAGAGGAUGAUCAGCCACACUGGGACUGAGACACGGCCCAGACUCCUACGGGAG

到目前为止,这是我的脚本:

use strict; 
use warnings;

#change ID line name to random unique shorten (max 10 characters) string

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

my $string;

while(<$fh>) {

  for (0..9) { $string .= chr( int(srand(rand(25) + 65) )); }

  if ($_ =~ s/^>*.+\n/>$string/){  # change header FASTA header    

    print $out_fh "$_";

  }
}

close $fh;
close $out_fh;

我一直在尝试这个,但它从10个字符开始,然后再添加10个字符,然后我失去了序列。我意识到已经存在类似的问题,但它略有不同,我需要随机生成唯一的缩写名称。

1 个答案:

答案 0 :(得分:1)

只需将$string重置为while循环内的空字符串,即可解决您的问题。但这是不必要的复杂(也是低效的 - 当你没有看到以>开头的行时,你生成并丢弃随机标识符);我会选择

perl -pe 'BEGIN { srand(time()); }
    s/>.*/ ">" . join ("", map { chr(rand(25)+65) } 0..9) /e' file.fasta

如果您不是绝对需要正确的伪随机标识符,可以只使用

perl -pe 'BEGIN { $id = "a" x 7 } s/>.*/">" . $id++/e' file.fasta

生成标识符,如&#34; aaaaaaa&#34;,&#34; aaaaaab&#34;等等(我选择了7个字符的标识符,但是4个字符对于8,000个唯一id:s来说已经足够了;你结束了&#34; alvr&#34;。)