【问题标题】:Counting how many times a combination of words appear in a given line using Perl使用 Perl 计算单词组合在给定行中出现的次数
【发布时间】:2013-05-27 05:20:07
【问题描述】:

亲爱的 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;
    }

但我必须计算的不是“start”出现了多少次,而是“start”和“id”出现在同一行中有多少次。我知道我必须添加一些正则表达式,但无法弄清楚任何事情。有什么想法吗?

问候!

【问题讨论】:

    标签: perl


    【解决方案1】:

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

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

    【讨论】:

    • 很棒,似乎可以解决一个小问题, (\S+) 到底是什么意思?抱歉新手问题
    • 明白了,\S+ 表示 1 个或多个空格字符
    • \S 是匹配 Perl 正则表达式中任何非空白字符的特殊字符。它周围的括号创建一个反向引用,这意味着这些括号内的表达式匹配的任何内容都将被保存(在本例中为内置变量 $1,因为这是表达式中的第一个反向引用)。这允许您仅提取数字,而不是整个匹配字符串(包括item_id: 等)。
    • @adriancdperu 它实际上匹配非空白字符。
    • 谢谢。所以 (\S+) 为模式 \S+ 创建了一个反向引用,它匹配 "item_id:" 之后的任何非空白字符
    【解决方案2】:

    给你一个讨厌的单线:

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

    【讨论】:

    • 天哪,谢谢。我想知道 (\d+) reg 表达式是什么意思?
    • 不必要的复杂示例 - OP 必须剥离这么多层才能了解如何实现他想要的。
    猜你喜欢
    • 2023-04-04
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多