计算一行中匹配的唯一匹配项

时间:2014-07-16 10:19:11

标签: regex perl

我有条目的文件: (----)Manish Garg 74163:V2.0.1_I3_SIT:键击的KeyStroke Logger解密文件显示与CCM时间相差4小时。 - 74163:键击的KeyStroke Logger解密文件显示与CCM时间相差4小时。 2014年7月4日 我想查找id“74163”的唯一计数或一行中的任何id。 目前它的输出为: updated_workitem值> “74163” 计数> “2” 但我希望计数值为1.(我不想在计数中包含重复的条目)

My code is 
my $workitem;
$file = new IO::File;
$file->open("<compare.log") or die "Cannot open compare.log";
@file_list = <$file>;
$file->close;
foreach $line (@file_list) {

        while ($line =~ m/(\d{4,}[,|:])/g ){
        @temp = split(/[:|,]/, $1);
        push @work_items, $temp[0];
                                        }
                                }

my %count;
my @wi_to_built;
map { $count{$_}++ } @work_items;

foreach $workitem (sort keys (%count)) {
chomp($workitem);
print "updated_workitem value> \"$workitem\"\n";
print "Count> \"$count{$workitem}\"\n";
}

2 个答案:

答案 0 :(得分:1)

使用哈希来跟踪特定行中找到的唯一ID:

foreach my $line (@file_list) {
    my %line_ids;
    while ($line =~ m/(\d{4,})[,|:]/g ){
        $line_ids{$1} = 1; # Record unique ids
    }
    push @work_items, keys %line_ids; # Save the ids
}

注意,我已经稍微更改了您的正则表达式,因此您不需要split到临时数组。

答案 1 :(得分:0)

您可以在执行map { $count{$_}++ } @work_items;

之前从数组中删除重复项
@work_items = uniq(@work_items);

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}

Demo