将标识符行名称更改为 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".)
我有一个包含大约 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".)