使用 Perl 从 FASTA 文件添加序列
Adding sequence from FASTA file using Perl
我还在学习 Perl,我有一个程序可以获取 FASTA 文件序列 header 并只打印方括号内的物种名称。我想添加到这段代码中,让它也打印与物种相关的整个序列。
这是我的代码:
#!/usr/bin/perl
use warnings;
my $file = 'seqs.fasta';
my $tmp = 'newseqs.fasta';
open(OUT, '>', $tmp) or die "Can't open $tmp: $!";
open(IN, '<', $file) or die "Can't open $file: $!";
while(<IN>) {
chomp;
if ( $_ =~ /\[([^]]+)\]/ ) {
print OUT "\n";
}
}
close(IN);
close(OUT);
这是我拥有的原始 FASTA 文件的示例:
>gi|334187971|ref|NP_001190408.1| Cam-binding protein 60-like G [Arabidopsis thaliana] >gi|332006244|gb|AED93627.1| Cam-binding protein 60-like G [Arabidopsis thaliana]
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL
目前输出只拉取种名Arabidopsis thaliana
但是,我希望它在 fasta 文件中正确打印:
>Arabidopsis thaliana
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL
您能否建议修改代码以实现此目的的方法?
那是因为它的作用:
if ( $_ =~ /\[([^]]+)\]/ ) {
print OUT "\n";
}
在 []
中查找并捕获任何文本。但是,如果该模式 与 不匹配,则您不会对该行执行任何其他操作 - 比如打印它。
添加:
else {
print OUT $_;
}
表示如果一行 不 包含 []
它将被默认打印。
我也会建议:
- 打开
use strict;
。
- 词法文件句柄是很好的做法:
open ( my $input, '<', $file ) or die $!;
- 默认情况下,模式匹配隐式应用于
$_
。所以你可以把 'if' 写成 if ( /\[([^]]+)\]/ )
关于您的程序的几个一般要点
您 必须始终 use strict
以及 use warnings 'all'
在您编写的每个 Perl 程序的顶部。它将揭示许多您很容易忽略的简单错误
您选择 open
的 three-parameter 形式做得很好,但您还应该使用词法文件句柄。所以这一行
open(OUT, '>', $tmp) or die "Can't open $tmp: $!";
should be written as
open my $out_fh, '>', $tmp or die "Can't open $tmp: $!";
- 最好在命令行上提供输入和输出文件名,这样您就不必针对不同的文件运行编辑程序
我会这样解决你的问题。它检查每一行是否是 header,其中包含用方括号括起来的字符串。第一个测试是该行以一个尖括号 >
开头,第二个测试与您在自己的程序中编写的捕获括号中的字符串的相同 - 物种名称
如果通过了这些检查,那么物种名称将被打印出来,并带有右尖括号和换行符,否则该行将按原样打印
这个程序应该是这样的运行
$ fasta_species.pl seqs.fasta > newseqs.fasta
美元只是Linux提示字符,它假设你已经把程序放在文件名fasta_species.pl
中。您可以省略 > newseqs.fasta
直接在屏幕上显示输出,这样您就可以看到正在生成的内容,而无需创建输出文件并对其进行编辑
use strict;
use warnings 'all';
while ( <> ) {
if ( /^>/ and / \[ ( [^\[\]]+ ) \] /x ) {
print ">\n";
}
else {
print;
}
}
输出
>Arabidopsis thaliana
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL
我还在学习 Perl,我有一个程序可以获取 FASTA 文件序列 header 并只打印方括号内的物种名称。我想添加到这段代码中,让它也打印与物种相关的整个序列。
这是我的代码:
#!/usr/bin/perl
use warnings;
my $file = 'seqs.fasta';
my $tmp = 'newseqs.fasta';
open(OUT, '>', $tmp) or die "Can't open $tmp: $!";
open(IN, '<', $file) or die "Can't open $file: $!";
while(<IN>) {
chomp;
if ( $_ =~ /\[([^]]+)\]/ ) {
print OUT "\n";
}
}
close(IN);
close(OUT);
这是我拥有的原始 FASTA 文件的示例:
>gi|334187971|ref|NP_001190408.1| Cam-binding protein 60-like G [Arabidopsis thaliana] >gi|332006244|gb|AED93627.1| Cam-binding protein 60-like G [Arabidopsis thaliana]
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL
目前输出只拉取种名Arabidopsis thaliana
但是,我希望它在 fasta 文件中正确打印:
>Arabidopsis thaliana
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL
您能否建议修改代码以实现此目的的方法?
那是因为它的作用:
if ( $_ =~ /\[([^]]+)\]/ ) {
print OUT "\n";
}
在 []
中查找并捕获任何文本。但是,如果该模式 与 不匹配,则您不会对该行执行任何其他操作 - 比如打印它。
添加:
else {
print OUT $_;
}
表示如果一行 不 包含 []
它将被默认打印。
我也会建议:
- 打开
use strict;
。 - 词法文件句柄是很好的做法:
open ( my $input, '<', $file ) or die $!;
- 默认情况下,模式匹配隐式应用于
$_
。所以你可以把 'if' 写成if ( /\[([^]]+)\]/ )
关于您的程序的几个一般要点
您 必须始终
use strict
以及use warnings 'all'
在您编写的每个 Perl 程序的顶部。它将揭示许多您很容易忽略的简单错误您选择
open
的 three-parameter 形式做得很好,但您还应该使用词法文件句柄。所以这一行
open(OUT, '>', $tmp) or die "Can't open $tmp: $!";
should be written as
open my $out_fh, '>', $tmp or die "Can't open $tmp: $!";
- 最好在命令行上提供输入和输出文件名,这样您就不必针对不同的文件运行编辑程序
我会这样解决你的问题。它检查每一行是否是 header,其中包含用方括号括起来的字符串。第一个测试是该行以一个尖括号 >
开头,第二个测试与您在自己的程序中编写的捕获括号中的字符串的相同 - 物种名称
如果通过了这些检查,那么物种名称将被打印出来,并带有右尖括号和换行符,否则该行将按原样打印
这个程序应该是这样的运行
$ fasta_species.pl seqs.fasta > newseqs.fasta
美元只是Linux提示字符,它假设你已经把程序放在文件名fasta_species.pl
中。您可以省略 > newseqs.fasta
直接在屏幕上显示输出,这样您就可以看到正在生成的内容,而无需创建输出文件并对其进行编辑
use strict;
use warnings 'all';
while ( <> ) {
if ( /^>/ and / \[ ( [^\[\]]+ ) \] /x ) {
print ">\n";
}
else {
print;
}
}
输出
>Arabidopsis thaliana
MKIRNSPSFHGGSGYSVFRARNLTFKKVVKKVMRDQSNNQFMIQMENMIRRIVREEIQRSLQPFLSSSCVSMERSRSETP
SSRSRLKLCFINSPPSSIFTGSKIEAEDGSPLVIELVDATTNTLVSTGPFSSSRVELVPLNADFTEESWTVEGFNRNILT
QREGKRPLLTGDLTVMLKNGVGVITGDIAFSDNSSWTRSRKFRLGAKLTGDGAVEARSEAFGCRDQRGESYKKHHPPCPS
DEVWRLEKIAKDGVSATRLAERKILTVKDFRRLYTIIGAGVSKKTWNTIVSHAMDCVLDETECYIYNANTPGVTLLFNSV
YELIRVSFNGNDIQNLDQPILDQLKAEAYQNLNRITAVNDRTFVGHPQRSLQCPQDPGFVVTCSGSQHIDFQGSLDPSSS
SMALCHKASSSTVHPDVLMSFDNSSTARFHIDKKFLPTFGNSFKVSELDQVHGKSQTVVTKGCIENNEEDENAFSYHHHD
DMTSSWSPGTHQAVETMFLTVSETEEAGMFDVHFANVNLGSPRARWCKVKAAFKVRAAFKEVRRHTTARNPREGL