我有一个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个字符,然后我失去了序列。我意识到已经存在类似的问题,但它略有不同,我需要随机生成唯一的缩写名称。
答案 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;。)