2016-04-25 60 views
1

我有一个带有一些二进制序列[010101 ...]的文件,我想在文件中得到最多的5位序列。我的文件查找文件中重复次数最多的序列

例子:

00010111000100100100100100100101110101010100011001010111011100010 

我已经通过生成所有可能的序列开始,也就是说,如果我走前7位,我会得到以下顺序:

00010 00101 01011 

现在我正在寻找一种方法来计算文件中每个序列的出现次数。

请帮忙吗?

+0

你在C,CPP,JAVA这样做呢?或者你想要伪代码? – dGRAMOP

+0

这似乎效率低下,计算每一个可能性... – dGRAMOP

+0

我在做Perl或TCL – aachraf

回答

2

如果你用perl,你可以去这样的事情:

use strict; 
use warnings; 

my $str = '00010111000100100100100100100101110101010100011001010111011100010'; 

# create list of all substrings of length 5 
my @sequences = map { substr $str, $_, 5 } 0..length($str) - 5; 

# build hash of counts for each substring 
my %counts; 
++$counts{$_} for @sequences; 

# take key corresponding to the maximum value in counts 
my ($max) = sort { $counts{$b} <=> $counts{$a} } keys %counts; 

print "$max\n"; 

输出:

10010 
+1

谢谢汤姆的帮助,它的工作很好 – aachraf

2

随着awk和UNIX utils的:

count.awk

{ 
    for(i=0;i<=length($0)-5;i++) { 
     a[substr($0,i,5)]++ 
    } 
} 
END{for(i in a){print i, a[i]}} 

称之为:

awk -f count.awk input.file | sort -k2 

这给你所有的5个序列的排序列表。如果你想只是最频繁使用:

awk -f count.awk input.file | sort -k2 | tail -n1 | cut -d' ' -f1 

顺便说一句,你也可以使用一个awk脚本,但海事组织上述工具的组合为您提供了更多的灵活性。

只是为了完整性:

count.awk

{ 
    for(i=0;i<=length($0)-5;i++){ 
     a[substr($0,i,5)]++ 
    } 
} 
END { 
    for(i in a) { 
     if(a[i]>=a[m] || !m) { 
      m=i 
     } 
    } 
    print m 
} 
+0

谢谢hek2mgl的帮助,我用了第一个它的脚本工作正常 – aachraf