Awk 查找文件中重复次数最多的序列
我有一个带有二进制序列[010101…]的文件,我想得到文件中生成最多的5位序列 我的文件示例:Awk 查找文件中重复次数最多的序列,awk,grep,Awk,Grep,我有一个带有二进制序列[010101…]的文件,我想得到文件中生成最多的5位序列 我的文件示例: 00010111000100100100100100100101110101010100011001010111011100010 我首先生成所有可能的序列,也就是说,如果我取前7位,我将得到以下序列: 00010 00101 01011 现在我正在寻找一种方法来计算文件中每个序列的出现次数 有什么帮助吗?如果您使用的是perl,您可以这样做: use strict; use warnings;
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";
如果您使用的是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";
使用
awk
和UNIX UTIL:
伯爵
这将为您提供所有5位序列的排序列表。如果您想要最频繁的,请使用:
awk -f count.awk input.file | sort -k2 | tail -n1 | cut -d' ' -f1
顺便说一句,您也可以使用单个
awk
脚本,但上述工具的组合为您提供了更大的灵活性
为了完整起见:
count.awk:
{
对于(i=0;i=a[m]| |!m){
m=i
}
}
打印m
}
与awk
和UNIX utils一起使用:
伯爵
这将为您提供所有5位序列的排序列表。如果您想要最频繁的,请使用:
awk -f count.awk input.file | sort -k2 | tail -n1 | cut -d' ' -f1
顺便说一句,您也可以使用单个awk
脚本,但上述工具的组合为您提供了更大的灵活性
为了完整起见:
count.awk:
{
对于(i=0;i=a[m]| |!m){
m=i
}
}
打印m
}
您是用C、cpp、java来做这件事的吗?或者你想要psuedo代码?考虑到每一种可能性,这看起来确实很低效……我用Perl或ClCl来做。你用Perl或Tcl来做,但标记为awk和grep?当Perl完全能够自己做这一切时,你从Perl调用awk肯定是错误的。你用C、cpp、java来做这件事吗?或者你想要psuedo代码?这看起来确实很低效,考虑到每一种可能性…我用Perl或ClCl做它,你用Perl或Tcl做它,但标记为awk和grep?当Perl完全能够自己做这一切时,你从Perl调用awk肯定是错误的。感谢hek2mgl的帮助,我用了第一个脚本,很好,谢谢hek2mgl的帮助,我用了第一个脚本,很好
awk -f count.awk input.file | sort -k2 | tail -n1 | cut -d' ' -f1
{
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
}