我正在尝试用一个数据集来计算移动平均值。但除此之外,我希望它在每次平均“窗口”移动时跳过一些数据。例如,如果我的数据集是从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
}
发布于 2017-11-18 03:10:02
我认为您的范围没有很好地指定,但您希望通过并行窗口来实现,如下所示
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个以上的窗口,也许你可以找个人来做这件事。
发布于 2017-11-18 04:36:41
我看到您希望每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
)。
https://stackoverflow.com/questions/47357230
复制相似问题