#!/bin/bash options="Viggo Mortensen,Nicky Byrne,Orlando Bloom,Ralph Fiennes" interval=300 avgpct=80 avgradius=2 #avgweights=(1) #0 #avgweights=(1 2 1) #1 avgweights=(1 2 3 2 1) #2 #avgweights=(1 2 3 4 3 2 1) #3 #avgweights=(1 2 3 4 5 4 3 2 1) #4 #avgweights=(1 2 3 4 5 6 5 4 3 2 1) #5 quiet=15 echo ",$options" >hellocounts.csv echo ",$options" >hellodiffs.csv echo ",$options" >hellodiffsavg.csv echo ",$options" >hellodiffsrunningavg.csv echo ",$options" >hellointervals.csv cat hellocounthistory.txt | cut -d ' ' -f "1,3" | tr -d '()' | sed 's/[0-9]=//g' | tr ' ' ',' >>hellocounts.csv echo "Big csv file done." starttime=0 endtime2=0 3= $endtime )) then if (($quiet < 10)) ; then echo "Next time interval is same sample points! re-using..." ; fi else endtime1=$starttime oldfoo="foo ($startvalues)" noteof=1 while read -u 3 endtime2 foo do noteof=0 if (($quiet < 10)) ; then echo "Testing time: $endtime2" ; fi tmpfoo=${foo/0=/} if (( ${#foo} == ${#tmpfoo} )) then echo "Data not found! Skipping to next line..." continue fi if (( $endtime2 >= $endtime )) then if (($quiet < 10)) ; then echo "Interval met!" ; fi break fi endtime1=$endtime2 #endvalues1=$endvalues2 oldfoo=$foo noteof=1 done if ((noteof != 0)) then echo "EOF on input file, done with interval-based ops." break fi # endvalues1=$(echo $oldfoo | cut -d ' ' -f 2 | tr -d '()' | sed 's/[0-9]=//g') # endvalues2=$(echo $foo | cut -d ' ' -f 2 | tr -d '()' | sed 's/[0-9]=//g') t=$oldfoo ; c=0 ; while (($c < $numfields)) ; do t=${t//$c=/} ; let c++ ; done for i in ${t//)/} ; do if [[ ${i:0:1} == "(" ]] ; then t=${i//(/} ; break ; fi ; done endvalues1=$t; t=$foo ; c=0 ; while (($c < $numfields)) ; do t=${t//$c=/} ; let c++ ; done for i in ${t//)/} ; do if [[ ${i:0:1} == "(" ]] ; then t=${i//(/} ; break ; fi ; done endvalues2=$t; fi if (($quiet < 10)) ; then echo "Interpolating between ($endvalues1) and ($endvalues2) for times $endtime1 to $endtime2 at $endtime." ; fi field=1 endvalues="" enddiffs="" nextavgs="" scaledavgs="" while (($field <= $numfields)) do # val1=$(echo $endvalues1 | cut -d ',' -f $field) # val2=$(echo $endvalues2 | cut -d ',' -f $field) # val3=$(echo $startvalues | cut -d ',' -f $field) c=1; for i in ${endvalues1//,/ } ; do [[ "$c" = "$field" ]] && val1=$i ;let c++ ; done c=1; for i in ${endvalues2//,/ } ; do [[ "$c" = "$field" ]] && val2=$i ;let c++ ; done c=1; for i in ${startvalues//,/ } ; do [[ "$c" = "$field" ]] && val3=$i ;let c++ ; done let "val = ( ($endtime - $endtime1) * $val2 + ($endtime2 - $endtime) * $val1 ) / ($endtime2 - $endtime1)" let "diff = $val - $val3" endvalues="$endvalues,$val" enddiffs="$enddiffs,$diff" c=1; for i in ${avgdiffs//,/ } ; do [[ "$c" = "$field" ]] && val4=$i ;let c++ ; done if (($val4 == -12345)) then let "val4 = 1000 * $diff" fi let "nextavg = ( ($avgpct * $val4) + ( (100 - $avgpct) * 1000 * $diff ) ) / 100" let "scaledavg = $nextavg * 60 / $interval" nextavgs="$nextavgs,$nextavg" scaledavgs="$scaledavgs,$scaledavg" if (($quiet < 10)) ; then echo "Interpolating field $field, for values $val1 at $endtime1 and $val2 at $endtime2, result $val at $endtime, $diff difference from $val3, $nextavg average" ; fi let "field += 1" done # endvalues=$(echo $endvalues | sed 's/^,//') # enddiffs=$(echo $enddiffs | sed 's/^,//') # avgdiffs=$(echo $scaledavgs | sed 's/^,//') endvalues=${endvalues:1} enddiffs=${enddiffs:1} avgdiffs=${nextavgs:1} scaledavgs=${scaledavgs:1} if (($quiet < 10)) ; then echo "Counts for $endtime are ($endvalues), diffs ($enddiffs), scaled avgs ($scaledavgs)." ; fi echo "$endtime,$enddiffs" >>hellodiffs.csv echo "$endtime,$scaledavgs" >>hellodiffsrunningavg.csv echo "$endtime,$endvalues" >>hellointervals.csv starttime=$endtime startvalues=$endvalues done let "avgwidth = $avgradius * 2 + 1" numpos=0 centpos=0 4 $avgradius && $centpos < $numpos )) then let "startpos = $centpos - $avgradius" if (( $startpos < 0 )) then echo "Starting position extends before data; clipping from $startpos to 0." startpos=0 fi let "endpos = $centpos + $avgradius" if (( $endpos >= $numpos )) then echo -n "Ending position extends past data; clipping from $endpos to " let "endpos = $numpos - 1" echo $endpos fi if (($quiet < 10)) ; then echo "Doing average for position $centpos, with $numpos positions used, and positions $startpos to $endpos for average." ; fi field=1 while (( $field <= $numfields )) do results[$field]=0 let field++ done results[0]=${data[($centpos % $avgwidth) * ($numfields + 1) + 0]} totalweight=0 pos=$startpos while (( $pos <= $endpos )) do let "weightpos = $pos - $centpos + $avgradius" weight=${avgweights[$weightpos]} let "totalweight += $weight" if (($quiet < 10)) ; then echo "Position $pos, weight $weight, total weight $totalweight." ; fi field=1 while (( $field <= $numfields )) do let "results[$field] += $weight * ${data[($pos % $avgwidth) * ($numfields + 1) + $field]}" if (($quiet < 5)) ; then echo "Data ${data[($pos % $avgwidth) * ($numfields + 1) + $field]} added to results gives ${results[$field]}." ; fi let field++ done let pos++ done resultline="${results[0]}" field=1 while (( $field <= $numfields )) do val=${results[$field]} let "val = $val / $totalweight" let "val = $val * 60 / $interval" resultline="$resultline,$val" let field++ done echo "$resultline" >> hellodiffsavg.csv let centpos++ fi done echo "Done creating averaged diffs." cut -d ',' -f '2-' hellodiffsavg.csv | paste -d ',' hellointervals.csv - > hellobig.csv echo "Made combined table." echo "Done!"