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

Change the identifier line name to random shortened name in fasta file

我有一个包含大约 8,000 个序列的 fasta 文件。我需要将标识符行名称更改为随机唯一的短名称(最大长度 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 个字符,然后我失去了顺序。我意识到已经有类似的问题,但略有不同,我需要随机生成唯一的缩写名称。

您的问题可以简单地通过将 $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

生成诸如 "aaaaaaa"、"aaaaaab" 等标识符(我选择了七个字符的标识符,但四个字符对于 8,000 个唯一的标识符来说绰绰有余 id:s;你' d 结束于 "alvr".)