使用 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