From b45e4c4d032f2dfeaa73a9bbcad3dd8a1cffcfae Mon Sep 17 00:00:00 2001 From: Steven Baltakatei Sandoval Date: Tue, 11 Aug 2026 18:01:30 +0000 Subject: [PATCH 1/1] feat(unitproc/bkt-sum_float):Sums stdin floats --- unitproc/bkt-sum_float | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 unitproc/bkt-sum_float diff --git a/unitproc/bkt-sum_float b/unitproc/bkt-sum_float new file mode 100755 index 0000000..ac98874 --- /dev/null +++ b/unitproc/bkt-sum_float @@ -0,0 +1,39 @@ +#!/bin/bash +# Desc: Sums newline-delimited floats received from stdin +# Usage: some_app | sumFloat +# Example: printf -- "-3\n0.14" | sumFloat +# Result: -2.860000 +# Version: 0.0.1 +# Depends: bc 1.07.1 + +yell() { echo "$0: $*" >&2; } # print script path and all args to stderr +die() { yell "$*"; exit 111; } # same as yell() but non-zero exit status +must() { "$@" || die "cannot $*"; } # runs args as command, reports args if command fails +sum_float() { + # Check dependencies + if ! command -v bc 1>/dev/random 2>&1; then die "FATAL:Missing:bc"; fi; + + # Store stdin + if [[ -p /dev/stdin ]]; then + input_stdin="$(cat -)" || { + die "FATAL:Error reading stdin."; }; + else + die "FATAL:No stdin detected."; + fi; + + # Process lines + local sum="0.0"; + local re; + re='^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$'; + if [[ -n $input_stdin ]]; then + while read -r line; do + if ! [[ "$line" =~ $re ]]; then die "FATAL:Not a float:${line}"; fi; + sum="$(printf -- "%f + %f\n" "$sum" "$line" | bc -l;)"; + done < <(printf "%s\n" "$input_stdin") || { + die "FATAL:Error parsing stdin."; }; + fi; + + # Print result + printf "%f\n" "$sum"; +}; # sum stdin floats + -- 2.39.5