2013-05-02 50 views
1

我有不同長度的每個文件中具有1000個seq的多個fasta文件。我想只保留每個序列的前200(n)個鹼基。我如何在Perl中做到這一點?fasta:在n長度後刪除序列

回答

0

很難準確地理解你的意思,沒有看到一個例子,但如果你只需要每行的前200個字符只使用cut

cut -c1-200 file 
+0

只爲我打印標題行。我在http://pastebin.com/51nVG5nD創建了一個示例輸入文件 – tripleee 2013-05-02 11:06:34

+0

我無法運行這個腳本,而是使用了下面的腳本,它運行流暢:cut -c -200文件。感謝您的幫助 – Ronn 2013-05-02 11:15:12

+0

@Ronn您是否在說我的原創答案'cut -c1-200'解決了您的問題? – 2013-05-02 11:56:57

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"; 
} 
+0

+1爲'$ /'技巧!但是這破壞了換行符。根據http://en.wikipedia.org/wiki/FASTA_format,行應保持在80個字符以下。 – tripleee 2013-05-02 10:31:36

+0

@triplee:這只是一個建議:-)您可以在'print'行之前添加'$ seq =〜s /(。{80})(?=。)/ $ 1 \ n/g;'。 – choroba 2013-05-02 11:00:19

+0

感謝Choroba,它完美的工作 – Ronn 2013-05-02 11:13:51

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 
+0

感謝Tripleee爲您的答案。我試過你的Perl腳本,它的工作。 – Ronn 2013-05-02 11:14:34

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); 
} 
0

下面是我如何解決這個問題,如果有興趣的人嘗試了另一種方式來做到這一點 我用包含在biolinux稱爲Fasta_formatter把實際的序列中的一個線(-w 0)的工具,然後修剪爲@sudo_O說,然後最後回到80個字母的寬度。

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