如何增加文本文件中的时间戳

时间:2018-06-13 11:57:25

标签: awk timestamp notepad++ text-manipulation

我正在比较两个长日志文件,除了时间戳之外完全相同。

例如:Log1

fn1-start 11:10:10
fn2-start 11:10:12
fn2-end   11:10:19
fn1-end   11:11:20
...
A long list
...

记录2

fn1-start 11:22:11
fn2-start 11:22:13
fn2-end   11:22:20
fn1-end   11:23:41
...
A long list
...

我想比较两个这样的日志文件,找出哪个函数使用某些比较工具导致性能下降。

我想要的是增加或减少其中一个日志文件中的所有时间戳。第二个文件的时间戳从11:22:11开始,在我的情况下,我可以将00:10:01添加到第一个日志文件时间戳并比较日志。

因此,将日志1时间戳增加00:12:01。 所以Log 1现在是:

fn1-start 11:22:11
fn2-start 11:22:13
fn2-end   11:22:20
fn1-end   11:23:21
...
A long list
...

在这种情况下,fn1在日志2中调用fn2函数后需要20秒才能完成。

我怎样才能做到这一点?我应该使用哪些工具?任何替代方法?

1 个答案:

答案 0 :(得分:0)

因此,您希望比较各个函数的运行时间,而不是将它们抵消,以便第一个函数在同一时间开始。

这意味着您需要在比较两个文件之前计算函数运行时间。这可以通过一个相当简单的awk脚本来完成:

function get_durations() {
  awk '
  BEGIN{
    # Split spaces and dashes
    FS="[ ]*|-"
  }

  /start/ {
    start[$1] = $3
  }

  /end/ {
    if($1 in start)
      end[$1] = $3
    else
      print "No corresponding \"start\" for function " $1 > "/dev/stderr"
  }

  # Function to convert timestamps into seconds using gnu coreutils date
  function timestamp_to_seconds(ts) {
    close(sprintf("date \"+%%s\" --date=\"%s\"", ts) | getline sec)
    return sec
  }
  END {
    for (x in start){
      if(end[x]){
        end_seconds = timestamp_to_seconds(end[x])
        start_seconds = timestamp_to_seconds(start[x])
        printf("%s %s\n", x, end_seconds - start_seconds)
      }
      else{
        printf("%s inf\n", x)
        print "No corresponding \"end\" for function " x > "/dev/stderr"
      }
    }
  }
  ' "${1}"
}

要比较持续时间,您可以使用awk数组以类似的方式进行操作:

function compare_durations() {
  gawk -P '
    BEGIN{
      print "function,file1_duration,file2_duration,12_difference"
    }
    f[$1] {
      printf("%s,%s,%s,%s\n",
        $1,
        $2,
        f[$1],
        ($2 == "inf" || f[$1] == "inf" ? "inf" : $2 - f[$1]))
    }
    !f[$1]{
      f[$1] = $2
    }
  ' "${1}" "${2}"
}

此功能将两个文件作为输入,并打印出具有两个文件之间比较结果的csv。

最后,您可以将这些功能一起使用来比较文件:

compare_durations <(get_durations input1) <(get_durations input2) > summary.csv
  

此解决方案假定函数名称不重复(如果重复)   重复一次,您可以更改脚本以为每个功能添加一个计数器。   该脚本的时间复杂度为O(n),但它占用O(n)空间,因此   如果日志真的很长,应该找到另一种方法。