В perl, как мне использовать регулярные выражения из одного файла для сопоставления последовательностей FASTA в другом файле

У меня есть два файла, первый (file1) содержит несколько rexeges, а другой (file2) содержит последовательности FASTA. Мое намерение состоит в том, чтобы использовать регулярное выражение в файле1, чтобы проверить, соответствуют ли они каким-либо последовательностям Fasta в файле2, и вывести все регулярные выражения, которые соответствуют хотя бы одной последовательности, с количеством последовательностей, которым они соответствуют. Я хотел бы предоставить свой пример кода, но я даже не мог начать. Пожалуйста помоги.

file1 структурирован таким образом, что каждая строка имеет идентификатор, за которым следует '>>', а затем регулярное выражение;

e.g FGER_HWW_PRT >> ..DW[ALK]..[^P]..[VI]{2,4}
    TKAR_GLW_NQW >> [^VKR]{0,2}..FP[D].T.N.Q.

    etc...

file2 имеет идентификатор последовательности в одной строке и последовательности в следующей строке;

e.g     >lac9_B: details details
    GFVTSDRWPALKMSRWSLEMVWASRGYPLVNDRMWSWSDDDP
    >serP_A: otherdetails details2
    GFVLSDPPPPALKMSRWSLEMVWASRGYPLVNDPWQRTKRKRKDRTCWASNYIHDRP

          etc...

Заранее спасибо.


person user2970374    schedule 22.11.2013    source источник
comment
Если вы не знаете, с чего начать, я бы начал с того, что избавился от необходимости получать регулярные выражения из файла1 и просто попытался написать Perl-скрипт, который содержит одно или два регулярных выражения непосредственно в нем и который открывает файл2 и смотрит для них. Если вы застряли с этим, вы можете опубликовать этот код здесь с проблемой.   -  person matt freake    schedule 22.11.2013


Ответы (1)


Это может помочь вам начать. Если вы считаете, что это может быть полезно для вас, дайте мне знать, и я могу объяснить, что происходит:

#!/usr/bin/perl
use warnings;
use strict; 

(Используя ваш файл .fasta в качестве входных данных):

my $infile = 'in.txt';
open my $input, '<', $infile or die "Can't open to $infile: $!";

my (@head, @seq, %hash);

Установите переменную match для проверки ваших заголовков:

my $match = "details2";
while (<$input>) {
    chomp;
    push @head, $_ if /^>/;
    push @seq, $_ if /^[A-Z]/;
    @hash{@head} = @seq;
}

Прокрутите ключи (заголовки) вашего хэша и проверьте вывод заголовка и последовательности, если они соответствуют вашей переменной соответствия:

foreach my $header (keys %hash){
    if ($header =~ /$match/){
    print "Name: $header\tcontains: '$match'\nSequence: $hash{$header}\n" ; 
    }
}

Выход:

Name: >serP_A: otherdetails details2    contains: 'details2'
Sequence: GFVLSDPPPPALKMSRWSLEMVWASRGYPLVNDPWQRTKRKRKDRTCWASNYIHDRP
person fugu    schedule 22.11.2013