我有一个带有一些二进制序列[010101 ...]的文件,我想在文件中得到最多的5位序列。我的文件查找文件中重复次数最多的序列
例子:
00010111000100100100100100100101110101010100011001010111011100010
我已经通过生成所有可能的序列开始,也就是说,如果我走前7位,我会得到以下顺序:
00010 00101 01011
现在我正在寻找一种方法来计算文件中每个序列的出现次数。
请帮忙吗?
我有一个带有一些二进制序列[010101 ...]的文件,我想在文件中得到最多的5位序列。我的文件查找文件中重复次数最多的序列
例子:
00010111000100100100100100100101110101010100011001010111011100010
我已经通过生成所有可能的序列开始,也就是说,如果我走前7位,我会得到以下顺序:
00010 00101 01011
现在我正在寻找一种方法来计算文件中每个序列的出现次数。
请帮忙吗?
如果你用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
谢谢汤姆的帮助,它的工作很好 – aachraf
随着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
}
谢谢hek2mgl的帮助,我用了第一个它的脚本工作正常 – aachraf
你在C,CPP,JAVA这样做呢?或者你想要伪代码? – dGRAMOP
这似乎效率低下,计算每一个可能性... – dGRAMOP
我在做Perl或TCL – aachraf