Regex 查找DNA序列中所有重复的4-聚体-Perl

Regex 查找DNA序列中所有重复的4-聚体-Perl,regex,perl,fasta,dna-sequence,Regex,Perl,Fasta,Dna Sequence,你好, 我尝试编写一个程序,读取包含多个DNA序列的FASTA格式化文件,识别序列中所有重复的4-mer(即,所有重复出现多次的4-mer),并打印出重复的4-mer和找到它的序列的头。k-mer是简单的k核苷酸序列(例如,“aaca”、“gacg”和“tttt”是4-mers) 这是我的密码: use strict; use warnings; my $count = -1; my $file = "sequences.fa"; my $seq = ''; my @header = ();

你好,

我尝试编写一个程序,读取包含多个DNA序列的FASTA格式化文件,识别序列中所有重复的4-mer(即,所有重复出现多次的4-mer),并打印出重复的4-mer和找到它的序列的头。k-mer是简单的k核苷酸序列(例如,“aaca”、“gacg”和“tttt”是4-mers)

这是我的密码:

use strict;
use warnings;

my $count = -1;
my $file = "sequences.fa";
my $seq = '';
my @header = ();
my @sequences = ();
my $line = '';
open (READ, $file) || die "Cannot open $file: $!.\n";

while ($line = <READ>){
    chomp $line;
    if ($line =~ /^>/){
        push @header, $line;
        $count++;
        unless ($seq eq ''){
            push @sequences, $seq;
            $seq = '';
        }
    } else {
        $seq .= $line;
    }
}   push @sequences, $line;

for (my $i = 0; $i <= $#sequences+1; $i++){
    if ($sequences[$i] =~ /(....)(.)*\g{1}+/g){
        print $header[$i], "\n", $&, "\n";
    }
}
使用严格;
使用警告;
我的$count=-1;
my$file=“sequences.fa”;
我的$seq='';
我的@header=();
我的@sequences=();
我的$line='';
打开(读取$file)| | die“无法打开$file:$!。\n”;
而($line=){
chomp$行;
如果($line=~/^>/){
按@标题,$line;
$count++;
除非($seq eq''){
推送@序列,$seq;
$seq='';
}
}否则{
$seq.=$line;
}
}按@行;

对于(我的$i=0;$i我可能会更像这样处理您的问题:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

#set paragraph mode. Iterate on blank lines. 
local $/ = ''; 

#read from STDIN or a file specified on command line, 
#e.g. cat filename_here | myscript.pl
#or myscript.pl filename_here
while ( <> ) {
   #capture the header line, and then remove it from our data block
   my ($header) = m/\>(.*)/;
   s/>.*$//;

   #remove linefeeds and whitespace. 
   s/\s*\n\s*//g;
   #use lookahead pattern, so the data isn't 'consumed' by the regex. 
   my @sequences = m/(?=([atcg]{4}))/gi;

   #increment a count for each sequence found. 
   my %count_of;
   $count_of{$_}++ for @sequences;

   #print output. (Modify according to specific needs. 
   print $header,"\n";

   print "Found sequences:\n";
   print Dumper \@sequences;
   print "Count:\n";
   print Dumper \%count_of;

   #note - ordered, but includes duplicates. 
   #you could just use keys  %count_of, but that would be unordered. 
   foreach my $sequence ( grep { $count_of{$_} > 1 } @sequences ) {
      print $sequence, " => ", $count_of{$sequence},"\n";
   }
   print "\n";
}
注意-因为它是基于原始序列的,它是基于数据中的顺序,你会在那里看到两次TGAC,因为…它在那里有两次

但是,您可以:

   foreach my $sequence ( sort { $count_of{$b} <=> $count_of{$a} }
                          grep { $count_of{$_} > 1 } 
                                 keys %count_of ) {
      print $sequence, " => ", $count_of{$sequence},"\n";
   }
   print "\n";
foreach my$序列(排序{$b}$count_的{$a}}$count_的{$a}
grep{$}>1}
键数%u(共个){
打印$sequence,“=>”,{$sequence},“\n”的$count_;
}
打印“\n”;

这将丢弃少于2个匹配项的任何匹配项,并按频率排序。

好的,解释4-mer实际上是什么!只有一个问题-它们可以重叠吗?你有一些样本数据和所需的输出吗?是的,它们可以重叠。我试图附加一个fasta文件,但看起来不可能。我将把一个示例复制到问题中很遗憾,我没有所需输出的示例。您使用的是什么版本的Perl?
Perl-v
我使用的是5.18版。不要回避模块。这是一个谬误。
Data::Dumper
是核心-它随Perl一起提供。但在这种情况下,它还是很方便的,主要用于打印诊断输出。您应该学习哈希,因为我这正是计算事物的正确工具。具有前瞻性捕获的好技巧。另一种方法是直接使用哈希:
my%count_of;/^.*([atgc]{4})(?{$count_of{$1}++})(*FAIL)/
@Zaid:那太可怕了。正则表达式模式在没有嵌入Perl代码的情况下,只使用一个字母的命令就足够神秘了。它的长度是Sobrique解决方案的两倍,这是我解决这个问题的方法,不再“直接到散列”请不要为了炫耀而推销针对简单问题的黑客解决方案。Perl已经有了一个不该有的名声,那就是如果你不给它加油,它就很难阅读。@ic23oluk:“我也不想使用模块(即转储程序)”这种态度太令人沮丧了。纯粹出于想象的原因,你剥夺了Perl 90%的实用性。你已经在使用两个“模块”在您自己的代码中:
strict
warnings
,以及
Data::Dumper
使用起来也同样琐碎,因为它也是perl本身的一部分。是的,但说真的-不要删除
strict;
警告
。如果这是限制的话,只需使用核心模块即可。
   foreach my $sequence ( sort { $count_of{$b} <=> $count_of{$a} }
                          grep { $count_of{$_} > 1 } 
                                 keys %count_of ) {
      print $sequence, " => ", $count_of{$sequence},"\n";
   }
   print "\n";