【问题标题】:How to search the first and last occurrence from the sample list [closed]如何从示例列表中搜索第一次和最后一次出现 [关闭]
【发布时间】:2023-03-09 09:29:01
【问题描述】:

我有一个来自我的应用程序的日志,例如:

{Fri Mar 16 19:07:47 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:47 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:48 Program: job-b: <blah><blah>
Fri Mar 16 19:07:48 Program: job-b: <blah><blah>
Fri Mar 16 19:07:50 Program: job-b: <blah><blah>
Fri Mar 16 19:07:51 Program: job-b: <blah><blah>
Fri Mar 16 19:07:52 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:52 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:53 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:54 Program: job-a: <blah><blah> 
Fri Mar 16 19:07:55 Program: job-a: <blah><blah> 
Fri Mar 16 19:08:00 Program: job-a: <blah><blah> 
Fri Mar 16 19:08:01 Program: job-a: <blah><blah> 
Fri Mar 16 20:33:52 Program: job-c: <blah><blah> 
Fri Mar 16 20:45:56 Program: job-c: <blah><blah>}

在这种情况下,对于每个作业名称(job-ajob-bjob-c),我需要找到第一次和最后一次出现的行来标识开始和结束时间。

即我需要输出程序/作业名称、start_time 和 end_time,如下面的示例输出所示。我已将预期输出显示为逗号分隔,但我并不真正关心分隔符,因为我只对值感兴趣。忽略示例输入/输出中开头和结尾的花括号。

job-a, Fri Mar 16 19:07:47, Fri Mar 16 19:08:01
job-b, Fri Mar 16 19:07:48, Fri Mar 16 19:07:51
job-c, Fri Mar 16 20:33:52, Fri Mar 16 20:45:56

【问题讨论】:

  • 如果您展示到目前为止您尝试过的代码并描述您遇到的问题,您将在这里得到更友好的接待和更好的帮助。如果没有代码,您的问题看起来像是请求免费咨询,很多人不喜欢这样。

标签: perl awk text-processing


【解决方案1】:

您可以使用awk,这里我只是展示如何获取每个作业的第一次和最后一次出现。

awk '!first[$6]{ first[$6]=$4 } { last[$6]=$4 } 
    END{ for (x in last) print x, first[x], last[x] }' OFS=', ' infile
job-a:, 19:07:47, 19:08:01
job-b:, 19:07:48, 19:07:51
job-c:, 20:33:52, 20:45:56

【讨论】:

    【解决方案2】:

    这是 Perl 中的一个示例:

    use feature qw(say);
    use strict;
    use warnings;
    
    my $fn = 'log.txt';
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    my %jobs;
    while (my $line = <$fh>) {
        chomp $line;
        next if $line !~ /job/;
        my ($date, $job ) = $line =~ /^(.*?)\s*Program:\s*(job.*?):/;
        if (exists $jobs{$job}) {
            $jobs{$job}->{end} = $date;
        }
        else {
            $jobs{$job}->{start} = $date;
        }
    }
    close $fh;
    
    for my $job (sort keys %jobs) {
        say join ", ", $job, $jobs{$job}->{start}, $jobs{$job}->{end};
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 2016-05-10
      相关资源
      最近更新 更多