2011-06-01 154 views
2

任何人都可以教我如何计算时间差的平均值吗?例如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 5 61.00

    so the calculation : 
        ((455-361) + (561 - 455))/2 
    

所以,我期待的输出是这样的:

 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,但我坚持......

+0

显示你的代码。 – daxim 2011-06-01 09:33:15

回答

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

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