+ -
当前位置:首页 → 问答吧 → shell命令实现动态窗口的计算

shell命令实现动态窗口的计算

时间:2011-02-23

来源:互联网

我有一批数据,格式如下,第一列为已排序的不连续自然数,总文件大概有5万多行:
711 4 8
892 3 6
956 2 5
10904 1 5
32210 5 12
38554 4 6
41362 0 1
56119 6 9
71326 2 6
71348 2 5
88300 8 10
90571 3 10
90606 2 6
。。。
想实现的是:以10000为步长,每5行进行一次计算,分别计算第二列的和与第三列的和,并输出这5行所在的区间范围以及区间大小(看第一列),也就是所得到的结果如下所示:
0-32210 15 36 32210
10000-56119 16 33 46119
20000-71326 17 18 51326
30000-71326 17 18 41326
40000-88300 18 31 48300
...
也就是说每5行就计算一次后两列的累加值,以10000为步长来移动窗口,第一列的区间大小是变动的(如10000-56119,20000-71326,即动态窗口),但落在每个区间的行数都是固定5行,最后一列为窗口大小(即第一列范围中的后一个数减前一个数)。到末尾时,若碰到最后一个区间的行数不足5行,则有多少行就计算那些行后两列的累加值,运行结束……
希望各路高手多多帮助,不胜感激!!!!!!!!!!跪求

作者: linaiting   发布时间: 2011-02-23

说实话,没有看懂唉
尤其是:
20000-71326
30000-71326
这两行就费解了……
而且71326前边只有9行,不是应该有10行吗?

作者: dzhxc   发布时间: 2011-02-24



QUOTE:
说实话,没有看懂唉
尤其是:
20000-71326
30000-71326
这两行就费解了……
而且71326前边只有9行, ...
dzhxc 发表于 2011-02-24 10:53




    因为原始数据没有20000~30000之间的啊,所以从20000开始和从30000开始是一样的

作者: 昭襄王   发布时间: 2011-02-24

回复 linaiting


    不考虑效率的话。。。
  1. #!/usr/bin/awk

  2. {
  3. a[NR]=$1;
  4. b[NR]=$2;
  5. c[NR]=$3;
  6. }
  7. END{
  8. step=0;
  9. while(1){
  10. for(i=1;i<=NR;++i){
  11. if(a[i]>=step){
  12. for(j=i;j<=i+4&&j<=NR;++j){
  13. sum2+=b[j];
  14. sum3+=c[j];
  15. }
  16. print step"-"a[j-1],sum2,sum3,a[j-1]-step;
  17. step+=10000;
  18. sum2=0;
  19. sum3=0;
  20. break;
  21. }
  22. }
  23. if(i>=NR)
  24. break;
  25. }
  26. }
复制代码

作者: yx07004212   发布时间: 2011-02-24

热门下载

更多