Perl如何在Multi Fasta文件中查找图案

时间:2019-06-14 07:42:04

标签: perl sequence

给出一个名为file.txt的多fasta文件:

>seq1  
CCTTTGGATGGCAAAATTTNTNGTAAA
AGGGCACCCANTTCTGGC  
>seq2
NNNNNGGGGCGTAANGAGGGGCACGG
TNCC
>seq3   
AAAAAANNNNTAC

我想找到与图案匹配的图案
[NC]。[CT](元素N或C后跟任意元素。后跟元素C或T)

[AT] [AN] .. [CG](元素A或T后跟元素A或N,后跟任意两个元素..后跟元素C或G)
对于以符号“>”开头的每个序列,并计算有多少个序列包含该基序。我在这段代码中遇到的主要问题是每个序列的迭代。这是我的代码:

#!/usr/bin/perl -w

use warnings;

if(!open(MY_HANDLE, "file.txt")){
    die "Cannot open the file";
}
 @content = <MY_HANDLE>;
close(MY_HANDLE);
foreach $row(@content){
  chomp($row);
     if (@matches1=$row =~ /([AT][AN]..[CG]+)/g)  {
     $numMat=scalar(@matches1);
     print("@matches1,$numMat\n");
     }
     elsif (@matches2=$row =~ /[NC].[CT]+/g)  {
     print("@matches2\n");
     }
  }

非常感谢

1 个答案:

答案 0 :(得分:1)

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

sub output {
    my ($id, $seq) = @_;
    my $count = () = $seq =~ /(?=[NC].[CT]|[AT][AN]..[CG])/g;
    say "$id\t$count" if $count;
}

my ($id, $seq);
while (<>) {
    chomp;
    if (/^>(\S*)/) {
        output($id, $seq) if defined $id;
        $id = $1;
        $seq = "";
    } else {
        $seq .= $_;
    }
}
output($id, $seq);

逐行处理文件。当您遇到序列标头时,请记住ID,否则将序列连接到其前一部分-模式可以在行边界上匹配!

output会再次被调用,否则最后一个序列将不会被处理。

由于模式可能会重叠,因此我使用了前瞻性(?=...)进行匹配。