2013-05-02 2 views

ответ

0

Трудно понять, что именно вы имеете в виду, не видя пример, но если вам нужно только первые 200 символов в строке просто использовать cut:

cut -c1-200 file 
+0

Только печатает строки заголовков для меня. Я создал образец входного файла в http://pastebin.com/51nVG5nD – tripleee

+0

Я не мог запустить этот скрипт, вместо этого я использовал приведенный ниже сценарий, который гладко выполнялся: cut -c -200. Спасибо за помощь. – Ronn

+0

@Ronn. Вы говорите, что мои оригинальные ответы 'cut -c1-200' решили вашу проблему? –

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

+0

@triplee: Это всего лишь рекомендация :-) Вы всегда можете добавить '$ seq = ~ s/(. {80}) (? =.)/$ 1 \ n/g;' перед строкой 'print'. – choroba

+0

Спасибо Choroba, он отлично работал – Ronn

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

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