From: Dr. David Kirkby on 13 Apr 2010 19:34 Does anyone know a simple way to create the n-point moving average of a set of numbers in a file in a shell script? I would think awk might be able to do it in some way, though I don't have a clue how. dave From: Seebs on 13 Apr 2010 19:46 On 2010-04-13, Dr. David Kirkby wrote:> Does anyone know a simple way to create the n-point moving average of > a set of numbers in a file in a shell script? I am not sure this is the right tool for the job. > I would think awk might be able to do it in some way, though I don't > have a clue how. awk -v points=3 -f thisfile.awk: { a[NR % points] = \$1; total = 0; for (i = 0; i < points; ++i) { total = total + a[i]; } print (total / points); } Not especially pretty or feature-laden, but it works. You get bonus points if you can explain both what the first line does and why it works. :) -s -- Copyright 2010, all wrongs reversed. Peter Seebach / usenet-nospam(a)seebs.net http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated! From: pk on 14 Apr 2010 04:31 Seebs wrote: > On 2010-04-13, Dr. David Kirkby wrote: >> Does anyone know a simple way to create the n-point moving average of >> a set of numbers in a file in a shell script? > > I am not sure this is the right tool for the job. > >> I would think awk might be able to do it in some way, though I don't >> have a clue how. > > awk -v points=3 -f thisfile.awk: > > { a[NR % points] = \$1; > total = 0; > for (i = 0; i < points; ++i) { total = total + a[i]; } > print (total / points); > } IIUC, shouldn't it be more like awk -v points=3 -f thisfile.awk: { a[NR % points] = \$1; if(NR>=points) { total = 0; for (i = 0; i < points; ++i) { total = total + a[i]; } print (total / points); } } From: Seebs on 14 Apr 2010 13:17 On 2010-04-14, pk wrote:> IIUC, shouldn't it be more like > > awk -v points=3 -f thisfile.awk: > > { a[NR % points] = \$1; > if(NR>=points) { > total = 0; > for (i = 0; i < points; ++i) { total = total + a[i]; } > print (total / points); > } > } Maybe! A lot of people don't have a clear definition of what they mean by a "moving average", I just figured I'd illustrate the simplest case... -s -- Copyright 2010, all wrongs reversed. Peter Seebach / usenet-nospam(a)seebs.net http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated! From: Dr. David Kirkby on 15 Apr 2010 13:06 On Apr 14, 6:17 pm, Seebs wrote:> On 2010-04-14, pk wrote: > > > IIUC, shouldn't it be more like > > > awk -v points=3 -f thisfile.awk: > > > { a[NR % points] = \$1; > >   if(NR>=points) { > >     total = 0; > >     for (i = 0; i < points; ++i) { total = total + a[i]; } > >     print (total / points); > >   } > > } > > Maybe!  A lot of people don't have a clear definition of what they mean > by a "moving average", I just figured I'd illustrate the simplest case... > > -s > -- > Copyright 2010, all wrongs reversed.  Peter Seebach / usenet-nos...(a)seebs.nethttp://www.seebs.net/log/<-- lawsuits, religion, and funny pictureshttp://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated! Thank you for that. It works perfectly. In my case, the number of data points is much greater than the likely number of points I want to average over, so extra test added is not strictly necessary. Dave  |  Next  |  Last