Perl Script для поиска мотива в мультифаст-файле и печати всей последовательности вместе со строкой заголовка - PullRequest
4 голосов
/ 08 февраля 2011

Я могу найти мотив в мультифаст-файле и распечатать строку, содержащую мотив .... но мне нужно распечатать все последовательности вместе со строкой заголовка мотива, содержащего последовательность фаста.Пожалуйста, помогите мне, я только начинающий в Perl

#!usr/bin/perl -w
use strict;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;


my $line;
open (FILE, "data.fa");
while ($line = <FILE>) {
  if ($line =~ /$motif/)  {
     print $line;
   }
}

Ответы [ 3 ]

3 голосов
/ 08 февраля 2011

Попробуйте:

Bio :: DB :: Fasta

Инструкции на странице.Для получения дополнительных примеров или инструкций просто поищите в Google: «use Bio :: DB :: Fasta»

Для установки просто следуйте любой из этих инструкций, я предлагаю использовать метод CPAN.pm в качестве суперпользователя:

Установка модулей Perl

2 голосов
/ 16 февраля 2011

Ваш скрипт, как написано выше, не запоминает текущие идентификаторы последовательности, поэтому вы не знаете, какой идентификатор связан с каждой последовательностью.

Я изменил ваш скрипт ниже, чтобы прочитать все последовательности FASTA в хеш, который отображает (идентификатор => последовательность), а затем перебрать этот хеш, распечатывая совпадения при необходимости.Это будет неподходящим подходом для очень больших файлов последовательностей, но обучение написанию небольших вспомогательных функций, таких как это, может очень сильно ускорить создание новых сценариев для анализа данных.Также важно понимать, как использовать и манипулировать хешами и другими структурами данных в Perl, так как большая часть кода, с которым вы сталкиваетесь, не будет написана новичками.

#!/usr/bin/perl

use strict;
use warnings;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;

my %seqs = %{ read_fasta_as_hash( 'data.fa' ) };
foreach my $id ( keys %seqs ) {
    if ( $seqs{$id} =~ /$motif/ ) {
        print $id, "\n";
        print $seqs{$id}, "\n";
    }
}

sub read_fasta_as_hash {
    my $fn = shift;

    my $current_id = '';
    my %seqs;
    open FILE, "<$fn" or die $!;
    while ( my $line = <FILE> ) {
        chomp $line;
        if ( $line =~ /^(>.*)$/ ) {
            $current_id  = $1;
        } elsif ( $line !~ /^\s*$/ ) { # skip blank lines
            $seqs{$current_id} .= $line
        }
    }
    close FILE or die $!;

    return \%seqs;
}
0 голосов
/ 01 апреля 2016

@ james_thompson - отличный ответ. Я бы использовал это, если вы ищете что-то более универсальное. Если вы ищете более простую версию (возможно, для преподавания?), Этого также будет достаточно - хотя учтите, что это может привести к потере мотивации, если в середине трудно вернуться.

#!usr/bin/perl -w
use strict;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;


my $line;
my $defline;
open (FILE, "data.fa");
while ($line = <FILE>) {
  if ($line =~ /^>/) {
     $defline = $line;
   } elsif ($line =~ /$motif/)  {
     print($defline,$line);
   }
}
close (FILE);

Обратите внимание, я также добавил явное закрытие на дескриптор файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...