计算1kb窗口的平均值

时间:2016-04-11 18:20:24

标签: linux unix awk grep

我的文件如下所示:

18  1600014 +   CAA 0   3
18  1600017 -   CTT 0   1
18  1600019 -   CTC 0   1
18  1600020 +   CAT 0   3
18  1600031 -   CAA 0   1
18  1600035 -   CAT 0   1
...

我正在尝试计算覆盖1000列第2列的窗口中第6列的平均值。因此,从1600001-1601000,1601001-1602000等,我的值从1600000-1700000开始。有什么方法可以做到这一步吗?我最初的想法是使用grep对这些值进行排序,但这需要许多不同的命令。我知道您可以使用awk计算平均值,但是您可以重复每个窗口吗?

欲望输出将是这样的:

1600001-1601000    3.215
1601001-1602000    3.141
1602001-1603000    3.542

1 个答案:

答案 0 :(得分:1)

你可以使用GNU awk来收集计数和总和,如果我理解你的问题是正确的,你可能需要这样的东西:

BEGIN { mod = 1000 
        PROCINFO["sorted_in"] = "@ind_num_asc"
      }

    {
      k= ($2 - ( $2 % mod ) ) / mod
      sum[ k ]+= $6
      cnt[ k ]++
    }

END { 
      for( k in sum ) printf( "%d-%d\t%6.3f\n", k*mod +1, (k+1)*mod, sum[k] / cnt [k])
    }