gpt4 book ai didi

python - 找到时间戳列表中的最大间隔(Perl 首选)

转载 作者:行者123 更新时间:2023-11-30 23:33:14 29 4
gpt4 key购买 nike

我接受任何解释语言 Perl、Python、Bash 等。但我更喜欢 Perl,因为它是我想要学习的。我有一个时间戳列表,例如:

17:31:16
17:31:16
17:31:18
17:31:29

我想找到任意 2 个连续行之间的所有最大间隔(前 5 个),并返回时间戳和行号。基本上,这是软件构建的日志文件,我试图确定哪些步骤花费的时间最长。我给出的例子实际上已经被过滤了,行实际上看起来像: [15:57:42]:CC net/sunrpc/xprtsock.o如果您能给我一个解析该格式的程序,那就会更容易一些,并返回时间差异最大的行号。

这就是我用来从日志中分离时间戳的方法

   perl -lane 'print $1 if $_ =~ /^\[(\d+:\d+:\d+)\]:*/'

我想要实现的输出类型是这样的:

 line 574 20:04:54
line 575 20:24:55
Difference 00:20:01

如果您不想解决问题,我很乐意看到一些伪代码或获得任何建议。我花了很多时间,却没有任何有用的代码可以展示。

最佳答案

我会稍微升级一下您的时间匹配正则表达式,以分别捕获时间的组成部分。我们是否需要担心在午夜之前开始并运行到第二天凌晨的构建?

#!/usr/bin/env perl
use strict;
use warnings;

my $oldtime = ""; # hh:mm:ss for end of long interval
my $oldlineno = 0; # line number in the file of second line
my $oldoffset = 0; # offset in seconds from midnight of second command
my $olddiff = 0; # time taken for longest command

sub hhmmss
{
my($time) = @_;
my(@tm) = (int($time/3600), int($time/60)%60, $time%60);
return @tm;
}

while (<>)
{
chomp;
next unless m/^((\d\d):(\d\d):(\d\d))\s+/;
my $newoffset = (($2 * 60) + $3) * 60 + $4;
if ($oldoffset == 0)
{
$oldtime = $1;
$olddiff = 0;
$oldoffset = $newoffset;
$oldlineno = $.;
}
elsif (($newoffset - $oldoffset) > $olddiff)
{
$oldtime = $1;
$olddiff = $newoffset - $oldoffset;
$oldoffset = $newoffset;
$oldlineno = $.;
}
}

if ($oldoffset != 0)
{
my $prvlineno = $oldlineno - 1;
my $newoffset = $oldoffset - $olddiff;
my(@tm) = hhmmss($newoffset);
printf "line $prvlineno: %.2d:%.2d:%.2d\n", $tm[0], $tm[1], $tm[2];
print "line $oldlineno: $oldtime\n";
@tm = hhmmss($olddiff);
printf "diff: %.2d:%.2d:%.2d\n", $tm[0], $tm[1], $tm[2];
}

给定数据文件 (data) 和上面的脚本 (dt.pl):

17:31:16 line1
17:31:18 line2
17:31:29 line3
17:33:59 line4
18:00:21 line5
18:21:03 line6
18:41:25 line7
19:51:54 line8
19:52:34 line9

下面的脚本生成所示的输出:

$ for i in $(seq 1 9); do sed ${i}q data | perl dt.pl; done | so
line 0: 17:31:16
line 1: 17:31:16
diff: 00:00:00
line 1: 17:31:16
line 2: 17:31:18
diff: 00:00:02
line 2: 17:31:18
line 3: 17:31:29
diff: 00:00:11
line 3: 17:31:29
line 4: 17:33:59
diff: 00:02:30
line 4: 17:33:59
line 5: 18:00:21
diff: 00:26:22
line 4: 17:33:59
line 5: 18:00:21
diff: 00:26:22
line 6: 18:00:21
line 7: 18:41:25
diff: 00:41:04
line 7: 18:41:25
line 8: 19:51:54
diff: 01:10:29
line 7: 18:41:25
line 8: 19:51:54
diff: 01:10:29
$

I'd love to hear how you thought about the problem before you wrote any of the code.

这显然是一个问题,需要记录前一行信息(的相关部分)以计算它与当前行之间的差异。您还需要保留当前的最大差异,在您读取第二个匹配行之前,该差异无法正式确定。这插入了设计。代码中的大量重复可以通过无条件分配 3 个值和有条件分配第四个值 ($olddiff) 来减少。之后,主要是机制和战术问题。

像这样跨多行匹配是一个令人讨厌的过程;你必须处理保持适当的状态。一部分是经验问题,另一部分是经验问题。这种事情做几十次之后,下次就不会那么久了。

关于python - 找到时间戳列表中的最大间隔(Perl 首选),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18989736/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com