fasta:删除n个长度后的序列

时间:2013-05-02 10:06:14

标签: perl bash fasta

我有多个fasta文件,每个文件中有1000个不同长度的seq。我想只保留每个序列的前200(n)个碱基。我怎么能在Perl中做到这一点?

5 个答案:

答案 0 :(得分:2)

如果序列打印在多条物理线上,则只能打印出第200个字符。以楔形开头的行是标题行,表示新序列的开始。

awk '/^>/{ seqlen=0; print; next; }
    seqlen < 200 { if (seqlen + length($0) > 200)
            $0 = substr($0, 1, 200-seqlen);
        seqlen += length($0); print }' file.fasta >newfile.fasta

哦,在Perl?

perl -nle 'if (/^>/) { $seqlen = 0; print; next }
    next if ($seqlen >= 200);
    $_ = substr($_, 0, 200-$seqlen) if ($seqlen + length($_) > 200);
    $seqlen += length($_);
    print;' file.fasta >newfile.fasta

答案 1 :(得分:1)

如果序列太长,请仅保留有趣的部分:

$/ = '>';
<>;
while (my $seq = <>) {
    $seq =~ s/>$//;
    $seq =~ s/^(.*)//;
    my $id = $1;
    $seq =~ s/\n//g;
    $seq = substr $seq, 0, 200;
    print ">$id\n$seq\n";
}

答案 2 :(得分:1)

我建议您考虑将BioPerl用于此类事情,因为它很容易完成这些任务,您不必担心格式化等问题。在下面的代码中,脚本的第一个参数是你的fasta,第二个参数是一个只保存每个序列的前200个碱基的文件。

#!/usr/bin/env perl

use strict;
use warnings;
use Bio::Seq;
use Bio::SeqIO;

my $usage = "$0 infile outfile\n";
my $infile = shift or die $usage;
my $outfile = shift or die $usage;

my $seqin = Bio::SeqIO->new(-file => $infile, -format => 'fasta');
my $seqout = Bio::SeqIO->new(-file => ">$outfile", -format => 'fasta');

while (my $seq = $seqin->next_seq) {
    my $first200 = $seq->subseq(1,200); # 1-based
    my $subseq = Bio::Seq->new(-seq => $first200, -id => $seq->id);
    $seqout->write_seq($subseq);
}

答案 3 :(得分:0)

如果没有看到示例,很难准确理解你的意思,但如果你只需要每行前200个字符,只需使用cut

cut -c1-200 file

答案 4 :(得分:0)

如果有人有兴趣尝试另一种方式,我会解决这个问题 我使用biolinux中包含的一个名为 Fasta_formatter 的工具将实际序列放在一行(-w 0),然后修剪为@sudo_O表示,然后最后回到80个字母宽度。

fasta_formatter -w 0 < FILE | cut -c1-LENGTH | fasta_formatter -w 80 > TRIMMED_FILE