我正在寻找一个能够有效地在文件中找到重复模式及其出现次数的Perl脚本。
示例文件输入:
1
2
3
1
2
5
1
2
4
示例输出 重复的模式是
1 - 3
2 - 3
1 2 - 3
答案 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