使用Perl从FASTA文件添加序列
我仍在学习Perl,我有一个程序,它能够获取FASTA文件序列头并只打印方括号内的物种名称。我想添加到这个代码中,让它也打印出与物种相关的整个序列 这是我的密码:使用Perl从FASTA文件添加序列,perl,sequence,fasta,Perl,Sequence,Fasta,我仍在学习Perl,我有一个程序,它能够获取FASTA文件序列头并只打印方括号内的物种名称。我想添加到这个代码中,让它也打印出与物种相关的整个序列 这是我的密码: #/usr/bin/perl 使用警告; my$file='seqs.fasta'; my$tmp='newseqs.fasta'; 打开(OUT,“>”,$tmp)或死亡“无法打开$tmp:$!”; 打开(在,中),这是因为它的作用: if ( $_ =~ /\[([^]]+)\]/ ) { print OUT "$
#/usr/bin/perl
使用警告;
my$file='seqs.fasta';
my$tmp='newseqs.fasta';
打开(OUT,“>”,$tmp)或死亡“无法打开$tmp:$!”;
打开(在,中),这是因为它的作用:
if ( $_ =~ /\[([^]]+)\]/ ) {
print OUT "$1\n";
}
就是在[]
中查找并捕获任何文本。但是如果该模式不匹配,您就不会对该行执行任何其他操作,比如打印它
添加:
else {
print OUT $_;
}
这意味着,如果一行不包含[]
,则默认情况下将打印该行
我还建议:
- 启用
使用严格;
- 词法文件句柄是一种很好的实践:
open(my$input),关于您的程序的一些一般要点
- 您必须始终
在编写的每个Perl程序的顶部使用strict
以及使用warnings'all'
。这将揭示许多简单的错误,否则很容易被忽略
- 选择
open
的三参数形式做得很好,但也应该使用词法文件句柄
open(OUT,'>',$tmp)或die“无法打开$tmp:$!”;
应写为
打开我的$out\u fh,'>',$tmp或die“无法打开$tmp:$!”;
- 最好在命令行上提供输入和输出文件名,这样您就不必编辑程序来针对不同的文件运行它
我会像这样解决你的问题。它会检查每一行是否都是一个包含方括号中的字符串的标题。第一个测试是该行以一个闭角括号开始
,第二个测试与你在自己的程序中编写的捕获括号中的字符串(物种名称)相同
如果这些检查通过,则物种名称将以闭合角括号和换行符打印,否则按原样打印
这个程序应该像这样运行
$fasta_species.pl seqs.fasta>newseqs.fasta
美元只是Linux提示字符,它假设您已将程序放入文件名fasta_species.pl
中。您可以省略>newseqs.fasta
将输出直接显示在屏幕上,这样您就可以看到正在生成的内容,而无需创建输出文件并对其进行编辑
使用严格;
使用“全部”警告;
而(){
如果(/^>/和/\[([^\[\]+)\]/x){
打印“>$1\n”;
}
否则{
印刷品;
}
}
输出
拟南芥
MKIRNPSPSFSHGGSGYSVFRANLTFKVKVMRDQSNNQFMiqmenmirivreeIQRSLQPFLSSCVSMERSSETP
SSRSRLKLCFINSPSSIPFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADDFTESWTVEGFNRNILT
QREGKRPLLTLGDLTVMLKNGVGVTGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKHHPPS
DEVWRLEKIAKADGVSATRLAERKILTVKDFRRLYIGGVSKKTWNTIVSHAMDCVLDETECYNANTPGVTLLFNSV
YELIRVSFGNDIQNLDQILDQLKAYQNLINRITAVNDRTFVGHPQSLQCPQDPGFVVTSCGSQHIDFQGSLDPSS
SMALCHKASSTVHPDVLMSFDNSSTARTFHIDKKFLPTFGNSFKVSELDQVHGKSQTVvTvTvTvKgCIENEDENAFSYHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRTARNPREGL
为什么要自己解析?谢谢,这很有意义。确保默认打印不包括标题中的内容,而只包括标题后的实际序列的最佳方法是什么?呃。取决于哪个位是“标题”你提到了。但是你可以这样做,例如,如果m/>/
跳过包含
的行,哦,哇,谢谢你的建议!我可以看到这将在哪里起作用。要正确格式化fasta文件,在物种名称之前包含
并在下一行打印,我只需在print OUT$\uCode>语句中添加\n即可是吗?是的。或者只是不把这行放在第一位,它就会保持它的换行。