时间跟踪工具打孔会生成一个时间日志,其中包含任务和时间戳,如"yyyymmddThhmmss"所示:
task started ended
---------------------------------------
task1 20121107T114348 20121107T120921
task2 20121107T121349 20121107T121430
task2 20121107T121658 20121107T124255
task1 20121107T140935 20121107T144153
task2 20121107T163449 20121107T180431
如何汇总在正则表达式中指定的每个任务上花费的总小时数和分钟数? 例如,为了将花费在包含my-regex
的任务上的时间相加,awk
或gawk
命令将是这样的:
awk '/my-regex/ { summing-of-corresponding-timestamps }' logfile.log
这是我之前问题的补充 - 我意识到我需要一个更"强大"的,基于正则表达式的解决方案。但我不是编码员,所以在AWK中对分钟和小时求和让我感到非常困惑。感谢您的任何帮助!
尝试使用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