首页 > 解决方案 > 如何从示例列表中搜索第一个和最后一个匹配项

问题描述

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

{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-a, job-b, job-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

标签: perlawktext-processing

解决方案


你可以这样做,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

推荐阅读