Unix 基于时间戳获取平均值的脚本

Unix 基于时间戳获取平均值的脚本,unix,file,scripting,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秒的记录的平均值。什么是一种快速有效的方法?这里是awk的一个起点。我知道你可以更好地优化代码 count == 0 { startTime = timeToSeconds($1) } { currentTime = time

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

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秒的记录的平均值。什么是一种快速有效的方法?这里是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
}

我将首先使用一些具有内置日期/时间“操作”的脚本语言。例如,在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等)中使用,因此开始计算时,就好像解析的日期实际上是数值一样,这很简单。

它必须是bash脚本吗?一个Python脚本会很容易。它也可以是一个Python脚本