使用Perl计算给定行中单词组合出现的次数

时间:2013-05-27 05:20:08

标签: perl

亲爱的Stackoverflow和Perl同志:

我对Perl有一点疑问: 我正在写一个日志阅读器。日志格式是这样的

    2013-05-27T19:01:23 [INFO] item_id:1, state:start at Reader.pm line 23
    2013-05-27T19:01:29 [INFO] item_id:2, state:pause at Reader.pm line 23
    2013-05-27T19:01:30 [INFO] item_id:1, state:start at Reader.pm line 23

...

我的目标是计算有多少状态:启动给定的item_id,例如,item_id:1,显示。在这种情况下,它应该是2。

到目前为止,我所想到的只是言语的反击:

    sub count {
    my $count_start = 0;

    open (MYFILE, $file_location) or die "Wrong filename";
    while ($file_location = <MYFILE>){
            while ($file_location =~ /\bstart\b/ig){
                    $count_start++;
            }
    }
    close (MYFILE);
    return $count_start;
    }

但我不得不计算“开始”出现多少次,但“开始”和“身份”出现在同一行的次数。我知道我必须添加一些正则表达式,但无法弄清楚任何事情。有什么想法吗?

问候!

2 个答案:

答案 0 :(得分:2)

假设该字段的顺序是可预测的:

my %counts;
while (<>) {
    ++$counts{$1} if /item_id:(\S+), state:start/;
}

答案 1 :(得分:-1)

对你来说是一个讨厌的单行:

mogul@guldager:~/tmp$ perl -MData::Dumper  -ne '$h{$1}++ if /(\d+), state:start/;END{print Dumper \%h}'<input-data.txt 
$VAR1 = {
          '1' => 2
        };