将秒转换为毫秒

时间:2019-05-23 07:00:58

标签: awk

文件: file.txt

Iteration 1
RAM: +2s342ms (total +417ms)

Iteration 2
RAM: +2s (total +385ms)

Iteration 3
RAM: +149ms (total +185ms)

代码取自https://stackoverflow.com/a/54702959/10220825

try.awk

/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
   for (key in vals)
   print key vals[key]
}

执行时:awk -f try.awk file.txt

预期输出:

RAM: 2342 2000 149

输出:

RAM: 2 2000 149

请帮助解决上述代码,将s转换为ms,这是将值sms混合使用时遇到的问题。

2 个答案:

答案 0 :(得分:1)

假设您的Input_file始终像显示的示例一样,请您尝试以下操作。

awk '
/RAM:/{
  sub(/^\+/,"",$2)
  num=split($2,array,"[s|ms]")
  if($2 ~ /[0-9]+s[0-9]+ms|[0-9]+s$/){
     print array[1] * 1000 + array[2]
  }
  else{
     print array[1]
  }
  num=""
}
'   Input_file

答案 1 :(得分:1)

ms捕获分支中,您假设只有毫秒。您可以做的一件事是使用正则表达式一次捕获两个可选组,并计算它们的时间:

/:/ {
    match($2, /\+(([0-9]+)s)?(([0-9]+)ms)?/, arr)
    ms_time = arr[2]*1000 + arr[4] + 0
    vals[$1]=vals[$1] OFS ms_time
}

END {
     for (key in vals)
         print key vals[key]
}

这里简化了行条件,并且在表达式中加入了时间捕获逻辑(您还需要解析该行,因此将不同情况下的所有情况分开都没有好处)。