У меня есть несколько файлов fasta с 1000 секциями в каждом файле разной длины. Я хотел бы сохранить только первые 200 (n) оснований из каждой последовательности. Как я могу это сделать в Perl?fasta: удалить последовательности после n длины
ответ
Трудно понять, что именно вы имеете в виду, не видя пример, но если вам нужно только первые 200 символов в строке просто использовать cut
:
cut -c1-200 file
Если последовательность слишком долго, держать только интересная часть:
$/ = '>';
<>;
while (my $seq = <>) {
$seq =~ s/>$//;
$seq =~ s/^(.*)//;
my $id = $1;
$seq =~ s/\n//g;
$seq = substr $seq, 0, 200;
print ">$id\n$seq\n";
}
+1 для «$ /' трюка! Но это разрушает новые линии. Согласно http://en.wikipedia.org/wiki/FASTA_format строки должны храниться ниже 80 символов. – tripleee
@triplee: Это всего лишь рекомендация :-) Вы всегда можете добавить '$ seq = ~ s/(. {80}) (? =.)/$ 1 \ n/g;' перед строкой 'print'. – choroba
Спасибо Choroba, он отлично работал – Ronn
Если последовательность печатается на нескольких строках, только печать через 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
Спасибо Tripleee за ваш ответ. Я попробовал ваш скрипт perl, и он сработал. – Ronn
Я рекомендую вам рассмотреть возможность использования 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);
}
Вот как я решить, если кто-либо заинтересован в пробуя другой способ сделать это я использовал средство, включенное в biolinux под названием Fasta_formatter поставить фактическую последовательность в одной строке (-w 0), затем обрезается как @sudo_O, а затем, наконец, возвращается к ширине 80 символов.
fasta_formatter -w 0 < FILE | cut -c1-LENGTH | fasta_formatter -w 80 > TRIMMED_FILE
Только печатает строки заголовков для меня. Я создал образец входного файла в http://pastebin.com/51nVG5nD – tripleee
Я не мог запустить этот скрипт, вместо этого я использовал приведенный ниже сценарий, который гладко выполнялся: cut -c -200. Спасибо за помощь. – Ronn
@Ronn. Вы говорите, что мои оригинальные ответы 'cut -c1-200' решили вашу проблему? –