1begin { 2 # INPUT PARAMETERS 3 # They can do 'mlr put -s window_size=4 -s input_field_names=x,y ...' 4 if (is_absent(@window_size)) { 5 @window_size = 3; 6 } 7 # In Miller 6 (Go port) we'll have arrays and you'll be able to do 8 # @input_field_names = ["x", "y"]. 9 if (is_absent(@input_field_names)) { 10 @input_field_names = splitnv("x,y", ",") 11 } else { 12 @input_field_names = splitnv(@input_field_names, ",") 13 } 14 15 # INITIALIZATION 16 @output_field_names = {}; 17 for (_, name in @input_field_names) { 18 @output_field_names[name] = name . "_avg"; 19 } 20 for (_, name in @input_field_names) { 21 for (i = 0; i < @window_size; i+=1) { 22 @windows[name][i] = 0; 23 } 24 } 25 # dump; 26} 27 28# Slide the windows 29for (_, name in @input_field_names) { 30 for (i = 1; i < @window_size; i+=1) { 31 @windows[name][i-1] = @windows[name][i]; 32 } 33} 34# Update the windows with new data 35for (_, name in @input_field_names) { 36 @windows[name][@window_size - 1] = $[name]; 37} 38 39# Compute the averages 40sums = {}; 41for (_, name in @input_field_names) { 42 for (i = 0; i < @window_size; i+=1) { 43 sums[name] += @windows[name][i]; 44 } 45} 46denominator = @window_size; 47if (NR < @window_size) { 48 denominator = NR 49} 50for (_, name in @input_field_names) { 51 $[@output_field_names[name]] = sums[name] / denominator; 52} 53