在perl中,如何使用一个文件中的正则表达式来匹配另一个文件中的FASTA序列

时间:2013-11-22 12:36:39

标签: regex perl fasta

我有两个文件,第一个(file1)包含几个rexeges,而另一个(file2)包含FASTA序列。我的目的是使用file1中的正则表达式来检查它们是否与file2中的任何Fasta序列匹配,并打印与至少一个序列匹配的任何正则表达式,以及它们匹配的序列数。我本来希望提供我的示例代码,但我甚至无法开始。请帮忙。

file1的结构使得每一行都有一个ID,后跟'>>',然后是正则表达式;

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...

提前致谢。

1 个答案:

答案 0 :(得分:0)

这可能会让你开始。如果您认为它可能对您有用,请告诉我,我可以解释发生了什么:

#!/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);

设置'匹配'变量以测试标题:

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