bash awk移动平均线与跳绳

时间:2017-11-17 18:40:12

标签: bash awk

我正在尝试用数据集计算移动平均线。但另外,我希望每次平均“窗口”时都跳过一些数据。移动。例如,如果我的数据集是1到20之间的列而我的平均窗口是5,那么当前计算是(1-5),(2-6),(3-7),(4-)的平均值8)..... 但我希望每次窗口移动时跳过一些数据,说我想跳过2.然后新的平均值将是(1-5),(4-8),(6-10),(8-12) ...... 这是我正在使用的当前awk文件,任何人都可以帮我编辑它,以便每次窗口移动时我都可以跳过一些数据吗?我也想改变跳过大小和窗口大小。非常感谢你!

#!/bin/awk

BEGIN {
    N=5          # the window size
}
{
    n[NR]=$1       # store the value in an array
}
NR>=N {            # for records where NR >= N
    x=0            # reset the sum variable
    delete n[NR-N] # delete the one out the window of N
    for(i in n)    # all array elements
        x+=n[i]    # ... must be summed
    print x/N  # print the row from the beginning of window
}

2 个答案:

答案 0 :(得分:0)

我认为您的范围没有明确规定,但您希望通过并行窗口来实现,如下所示

awk        '{sum[1]+=$1}    
     !(NR%5){print NR-4"-"NR, sum[1]/5; sum[1]=0}
        NR>3{sum[4]+=$1}
      NR>3 && !((NR-3)%5){print NR-4"-"NR, sum[4]/5; sum[4]=0}' <(seq 15)

将给出,你可以删除那里的打印范围进行调试。

1-5 3
4-8 6
6-10 8
9-13 11
11-15 13

用于制作窗口大小和跳过计数变量

awk -v w=5 -v s=3 'function pr(x)    {print (NR-s-1)"-"NR, sum[x]/w; sum[x]=0}
                                     {sum[1]+=$1} 
                   NR>s              {sum[s+1]+=$1} 
                   !(NR%w)           {pr(1)} 
                  NR>s && !((NR-s)%w){pr(s+1)}' file

第一个窗口始终从1开始,第二个窗口从s + 1开始。这可以概括为超过2个窗口,也许你可以找人来做...

答案 1 :(得分:0)

我看到你想要每K刻度打印MA而不是每打勾(K=1)打印。因此,您可以在现有代码中打印之前添加条件NR%K==0

但最好保留N个元素的数组并覆盖它们而不是删除它们。使用NR%N作为数组索引。这样,当K不是1并且不想计算MA时,您将避免检查要删除的元素数等。

awk -v n=5 -v k=2       '{ a[NR%n]=$0 } 
    NR>=n && (NR-n)%k==0 { s=0; for (i in a) s+=a[i]; print NR ":\t" s/n }' file

将条件更新为(NR-n)%k==0,始终从计算MA的第一个刻度开始(即NR=n)。