Perl脚本找到重复模式和文件中出现的次数?

时间:2015-10-08 08:45:46

标签: perl

我正在寻找一个能够有效地在文件中找到重复模式及其出现次数的Perl脚本。

示例文件输入:

1
2
3
1
2
5
1
2
4

示例输出 重复的模式是

1 - 3

2 - 3

1 2 - 3

2 个答案:

答案 0 :(得分:1)

我认为你必须限制模式大小,否则复杂性将成为一个问题。 鉴于P是模式大小,N文件(列表)长度我的解决方案的复杂度应为O(N * P)

my $window_size = 5;
my @input = qw ( 1 2 3 1 2 5 1 2 4 );


my %result;
my %windows;

foreach my $inp (@input) {
    for my $win_size (1..$window_size){
        push @{ $windows{$win_size} } , $inp;
        shift @{ $windows{$win_size} } if scalar @{ $windows{$win_size} } > $win_size;
        my $win_string = join(' ', @{ $windows{$win_size} });
        $result{$win_string} += 1 if scalar @{ $windows{$win_size} } == $win_size;
    }
}

foreach (sort { length $a <=> length $b } keys %result) {
   print "$_ \t\t $result{$_}\n";
}

答案 1 :(得分:0)

以下是使用hash的方法。以下代码将为您提供文件中的重复模式及其出现次数

#!/usr/bin/perl
use warnings;
use strict;

my %count;

open my $fh, "<", "abc.txt" or die $!;

while(my $line = <$fh>)
{
    chomp $line;
    $count{$line} += 1;
}
close $fh;

foreach my $pattern (sort keys %count)
{
    next if ($count{$pattern} == 1);
    print $pattern . " - " . $count{$pattern} . "\n";
}

输出:

1 - 3
2 - 3