如何计算模式显示的次数

时间:2015-06-16 13:49:51

标签: perl count

我正在尝试计算特定字符串在文本文档中出现的次数,以便在少于5次的情况下删除该字符串。文本文件包含格式为2015-06-16 07:40:00的日期列表。

在处理从2015-06-16 07:40:002015061607的传入数据后,我想计算此字符串出现的次数。我对输入数据的处理是正确的,但我不知道如何计算字符串的出现次数。

这是我到目前为止所拥有的。

#!/usr/bin/perl

foreach $file (@ARGV) {

open (OUT, ">/d2/aschwa/scripts_and_programs/NST_Scripts/data_organizers/Filtered_$file") || die "Cannot open specified file\n";

open (RAW, "/d2/aschwa/scripts_and_programs/NST_Scripts/data_organizers/$file") || die "Cannot open specified file to be processed\n";

while(<RAW>) {

    $event = $_;
    chop($event);
    @event = split (',', $event);
    ($date_time, $var1, $var2, $var3) = @event[(0,1,2,3)];

    @date_time = split (' ', $date_time);
    ($date, $time) = @date_time[(0,1)];

    @date_mod = split ('-', $date);
    ($year, $month, $day) = @date_mod[(0,1,2)];
    @time = split (':', $time);
    ($hr, $mins, $sec) = @time[(0,1,2)];

    $datehr = $year . $month . $day . $hr;

    foreach ($event) {
        $count{$datehr}++;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我认为您应该使用正则表达式而不是重复调用split

此示例读取每个文件两次,计算第一次传递的日期并打印日期在第二次传递时出现五次以上的行

它不像你那样压缩日期时间,但只捕获小时字段,因此%count哈希的键看起来像2015-06-16 07。删除标点符号只是额外的代码,没有必要使程序正常工作

我还使用了autodie,它自Perl v5.10开始提供,并自动检查openchdir来电的状态。最佳实践是使用词法文件句柄和open

的三参数形式
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use autodie;

use constant DIR => '/d2/aschwa/scripts_and_programs/NST_Scripts/data_organizers';

chdir DIR;

for my $file ( @ARGV ) {

    open my $raw_fh, '<', $file;

    my %count;

    while ( <$raw_fh> ) {
        ++$count{$1} if /^(\d\d\d\d-\d\d-\d\d \d\d):\d\d:\d\d/;
    }

    seek $raw_fh, 0, 0; # Rewind input file

    open my $out_fh, '>', "Filtered_$file";

    while ( <$raw_fh> ) {
        print unless /^(\d\d\d\d-\d\d-\d\d \d\d):\d\d:\d\d/ and $count{$1} < 5;
    }

}