0

时间跟踪工具孔生成一个包含任务和时间戳的时间日志,如“yyyymmddThhmmss”:

task    started         ended
---------------------------------------
task1   20121107T114348 20121107T120921
task2   20121107T121349 20121107T121430
task2   20121107T121658 20121107T124255
task1   20121107T140935 20121107T144153
task2   20121107T163449 20121107T180431

我如何总结在正则表达式中指定的每项任务上花费的总小时数和分钟数?例如,将花费在包含my-regexawkorgawk命令的任务上的时间加起来是这样的:

awk '/my-regex/ { summing-of-corresponding-timestamps }' logfile.log

这是对我之前的问题的补充——我意识到我需要一个更“强大”、基于正则表达式的解决方案。但我不是编码员,所以在 AWK 中总结分钟和小时让我非常困惑。谢谢你的帮助!

4

1 回答 1

5

用 GNU awk 试试这个,我没有检查过数学:

$ cat tst.awk
NR<3{ next }
{
   start = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$2))
   end   = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$3))
   dur[$1] += end - start
}
END {
   for (task in dur)
      print task, dur[task]
}
$
$ gawk -f tst.awk file
task1 3471
task2 6980

几秒钟内的输​​出,按摩以适应...

编辑:要获得满足某些 RE 的所有任务的总持续时间是:

NR<3{ next }
$1 ~ re {
   start = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$2))
   end   = mktime(gensub(/(....)(..)(..).(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 \\6","",$3))
   dur += end - start
}
END {
   print dur
}

$ gawk -v re='<specify your RE>' -f tst.awk file

史蒂夫的编辑:

这个答案几乎就在那里。我做了一些小改动,结合了上面/下面评论中的信息。您可以根据需要更改正则表达式,例如:

awk '/task/ { a = "(....)(..)(..).(..)(..)(..)"; b = "\\1 \\2 \\3 \\4 \\5 \\6"; t += mktime(gensub(a, b, "", $NF)) - mktime(gensub(a, b, "", $(NF-1))) } END { print t }' file

结果:

10451
于 2012-12-05T21:26:29.307 回答