脚本根据时间戳获得平均值

时间:2009-09-24 13:32:07

标签: unix file scripting

我的文本文件中有两个字段

timestamp  number

时间戳的格式为hh:mm:ss.mmm

一些样本记录

18:31:48.345 0.00345

18:31:49.153 0.00123

18.32:23.399 0.33456

我想打印出相差不超过30秒的平均记录。什么是好的和快速的做法

2 个答案:

答案 0 :(得分:1)

这是awk的起点。我知道你可以更好地优化代码。

count == 0 { startTime = timeToSeconds($1) }
{   currentTime = timeToSeconds($1)
    elapsedTime = currentTime - startTime
    if (elapsedTime > 30.0) {
        calculateAverage()
        startTime = timeToSeconds($1)
    }
    print
    sum += $2
    count++
}
END { calculateAverage() }
function timeToSeconds(timeString) {
    # Convert a time string to number of seconds
    split(timeString, tokens, ":")
    seconds = tokens[1]*3600.0 + tokens[2]*60.0 + tokens[3]
    return seconds
}
function calculateAverage() {
    # Use & modify global vars: count, sum
    average = sum / count
    printf "Average: %.4g\n\n", average
    sum = 0.0; count = 0
}

答案 1 :(得分:0)

我首先要使用一些内置日期/时间'操作'的脚本语言。例如,在Ruby中你可以很容易地做到:

require 'time'

t,n = gets.chomp.split(/\s+/)
ts1 = Time.parse(t)

# ...

t,n = gets.chomp.split(/\s+/)
ts2 = Time.parse(t)

现在允许您执行以下操作:

diff = ts2 - ts1
if diff > 30
   # difference is greater than 30 seconds
end

Ruby Time对象可以在上下文中使用(float,int,String等),因此开始进行计算就好像解析的日期实际上是数值一样。