我正在尝试用数据集计算移动平均线。但另外,我希望每次平均“窗口”时都跳过一些数据。移动。例如,如果我的数据集是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
}
答案 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
)。