0

タイムトラッキングツールのパンチは、「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で分と時間を合計すると本当に混乱しました。助けてくれてありがとう!

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 に答える