====== 分割序列矩阵fasta_split.pl ====== ===== 矩阵格式 ===== 要处理的FASTA序列矩阵格式如下(数据已处理过,非真实数据): >CPBOL076-11|JF952978|LiujqAB08|Abies squamata|matK CGATCGTTGTCTCATGGATCTTTCCCTGATCAAACTCATTTTGATCGAAAGATCAAACATATTATCAGAAATTATCGTCG AAATTCACTGAAAAGTATCTGGTCGTTGAAGGATCCTAGAATTCACTATGTTAGATATGCAGAAAGATCTATTATAGCTA TAAAGGGTACTCATCTCCTAGTGAAAAAATGTAGATATCATCTTCCAATTTTTCGGCAATTTTATTTCCATCTTTGGTCC GAACCATATAGGGTATGTTCTCATCAATTATC >CPBOL121-11|JF953012|Yangqe0222|Aconitum angustius|matK GCCCCCTTTTTGCACTTATTGAGACTCTTTCTCTACGAGTATCATCATTGGAATATTCTTATTACTCAAAAAAATCAAAT GAATTTCTTTTTTTCAAAAGAGAATCAAAGATTTTTTCTGTTCCTATATAATTTTCATGTATATGAATCGGAATCCATAT TCGTTTTTCTCCGTAAACAATCTTCTCATTTACGATCAACATCCTCTAGAGCTTTTCTTGATCGAACAC ... 矩阵由多条序列数据组成,每条序列又由一行注释(以>开头),和后续的一行或多行数据构成。 ===== 程序功能 ===== 程序要做的: - 将序列分割出来,每条序列单独生成一个文件; - 文件以注释行的第三项(用|分隔)加固定前缀命名,新文件格式依旧是FASTA; - 同时输出文件名与注释行第三项、第二项的对应关系。 ===== 代码简述 ===== 临时更换行结束符,滤掉第一条序列前的所有字符: $/ = ">"; <>; $/ = "\n"; 获取注释行中的信息: while (<>) { my $sample_id = ""; my $genbank_no = ""; my $seq = ""; if (/^.+\|(.+)\|(.+)\|.+\|.+$/) { $sample_id = $2; $genbank_no = $1; } else { next; } 获取序列数据,并去掉所有多余字符。因序列数据可能有多行,所以需要再次临时更换行结束符: $/ = ">"; $seq = <>; $/ = "\n"; $seq =~ s/\r//g; $seq =~ s/\n//g; $seq =~ s/\s//g; $seq =~ s/-//g; $seq =~ s/~//g; $seq =~ s/>$//; 生成目标文件: my $new_sample_id = "CPBOL2010-" . $sample_id; my $filename = $new_sample_id . ".fasta"; open OUTFILE, ">", $filename; print OUTFILE ">" . $new_sample_id . "\r\n"; print OUTFILE $seq . "\r\n"; close OUTFILE; 输出对应关系: print "$filename\t\t\t$new_sample_id\t$genbank_no\r\n"; 继续处理下一条序列,直到结束: } exit 0; 完毕。 {{tag>Perl}}