文件: 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
,这是将值s
和ms
混合使用时遇到的问题。
答案 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]
}
这里简化了行条件,并且在表达式中加入了时间捕获逻辑(您还需要解析该行,因此将不同情况下的所有情况分开都没有好处)。