RosettaCodeData/Task/Cumulative-standard-deviation/Jq/cumulative-standard-deviation-4.jq
2023-07-01 13:44:08 -04:00

38 lines
906 B
Bash

#!/bin/bash
# jq is assumed to be on PATH
PROGRAM='
def standard_deviation: .ssd / .n | sqrt;
def update_state(observation):
def sq: .*.;
((.mean * .n + observation) / (.n + 1)) as $newmean
| (.ssd + .n * ((.mean - $newmean) | sq)) as $ssd
| { "n": (.n + 1),
"ssd": ($ssd + ((observation - $newmean) | sq)),
"mean": $newmean }
;
def initial_state: { "n": 0, "ssd": 0, "mean": 0 };
# Input should be [observation, null] or [observation, state]
def standard_deviations:
. as $in
| if type == "array" then
(if .[1] == null then initial_state else .[1] end) as $state
| $state | update_state($in[0])
| standard_deviation, .
else empty
end
;
standard_deviations
'
state=null
while read -p "Next observation: " observation
do
result=$(echo "[ $observation, $state ]" | jq -c "$PROGRAM")
sed -n 1p <<< "$result"
state=$(sed -n 2p <<< "$result")
done