Awk 查找文件中重复次数最多的序列

Awk 查找文件中重复次数最多的序列,awk,grep,Awk,Grep,我有一个带有二进制序列[010101…]的文件,我想得到文件中生成最多的5位序列 我的文件示例: 00010111000100100100100100100101110101010100011001010111011100010 我首先生成所有可能的序列,也就是说,如果我取前7位,我将得到以下序列: 00010 00101 01011 现在我正在寻找一种方法来计算文件中每个序列的出现次数 有什么帮助吗?如果您使用的是perl,您可以这样做: use strict; use warnings;

我有一个带有二进制序列[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";

如果您使用的是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
}