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

awk,计算不同时间间隔的平均值,awk,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 这里的挑战 列数是动态的,这意味着并非所有行都具有相同的列数 为了计算平均值,

有人能教我如何计算时间差的平均值吗?比如说

    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
这里的挑战

  • 列数是动态的,这意味着并非所有行都具有相同的列数
  • 为了计算平均值,我们有一个例子:361.00455.00561.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,但我卡住了

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

    ((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使用的
    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