awk,计算不同时间间隔的平均值

时间:2011-06-01 09:20:22

标签: awk

任何人都可以教我如何计算时间差之间的平均值?例如

    412.00 560.00 
    0 0 
    361.00 455.00 561.00 
    0 0 
    0 0 
    0 0 
    237.00 581.00 
    425.00 464.00 
    426.00 520.00 
    0 0 

正常情况下,他们将所有这些数字的总和除以总数

    sum/NR

这里的挑战

  1. 列数是动态的,这意味着并非所有行都具有相同的数字列
  2. 计算平均值,例如我们有:361.00 455.00 561.00

        so the calculation :
        ((455-361) + (561 - 455))/2
    
  3. 所以,我期待的输出是这样的:

          total_time divided_by average
          148        1          148
          0          1          0
          200        2          100
          0          1          0
          0          1          0
          0          1          0
          344        1          344
          :          :          :
          :          :          :
          :          :          : 
    

    我试图使用awk,但我卡住了......

2 个答案:

答案 0 :(得分:2)

具有三个或更多时间值的行上的中间值是没有意义的 - 只有值的数量很重要。要从您的示例中看到这一点,请注意:

((455-361) + (561 - 455))/2 = (561 - 361) / 2

因此,你真的需要做一些像

这样的事情
cat time_data |
  awk '{ printf("%f\t%d\t%f\n", ($NF - $1), (NF - 1), ($NF - $1) / (NF - 1)) }'

对于您的示例数据,这会给出您指定的结果(尽管格式不如您提供的那样)。

这假定时间值在行上排序。如果没有,请计算最大值和最小值,并分别替换$NF$1次使用。

答案 1 :(得分:0)

bash脚本:

#!/bin/bash
(echo "total_time divided_by average"
while read line
do
 arr=($line)
 count=$((${#arr[@]}-1)) 
 total=$(bc<<<${arr[$count]}-${arr[0]})
 echo "$total $count $(bc<<<$total/$count)"
done < f.txt ) | column -t

<强>输出

total_time  divided_by  average
148.00      1           148
0           1           0
200.00      2           100
0           1           0
0           1           0
0           1           0
344.00      1           344
39.00       1           39
94.00       1           94