#! /usr/bin/gawk -f # Last edited on 2016-10-31 10:06:38 by stolfilocal BEGIN { # User must define (with "-v"): # {ofmt} the format for the output value. # {emax} the max abs change in the value by formatting. # {fdate} the last date to keep. abort = -1; if (ofmt == "") { arg_error(("must define {ofmt}")); } if (emax == "") { arg_error(("must define {emax}")); } if (fdate == "") { arg_error(("must define {fdate}")); } huge = 1.0e200; # A huge number. vmax = -huge; # Max value field seen (after reformatting). vmin = huge; # Min value field seen (after reformatting). fNR = ""; # NR of record where {fdate} was found, or "" if not found. } (abort >= 0) { exit abort; } /^[0-9][-\/0-9]+[0-9][ ]+[0-9][0-9][:][0-9][0-9][:][0-9][0-9] *[,] *[-+]?[0-9]+([.][0-9]+)?([Ee][0-9]+)? *$/ { gsub(/[,]/, " ", $0); if (NF != 3) { data_error(("wrong num fields " NF)); } dt = $1; tm = $2; va = $3; # Reformat the date: if (dt ~ /^[0-9][0-9][\/][0-9][0-9][\/]20[0-9][0-9]$/) { dtn = (substr(dt,7,4) "-" substr(dt,4,2) "-" substr(dt,1,2)); } else if (dt ~ /^20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/) { dtn = dt; } else { data_error(("bad date format \"" dt "\"")); } if (dtn !~ /^20(09|[12][0-9])-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/) { data_error(("bad date conversion \"" dt "\" --> \"" dtn "\"")); } # Reformat the value: gsub(/E/, "e", va); van = sprintf(ofmt, va); er = van - va; if (er < 0) { er = - er; } if (er > emax) { data_warning(("value changed by format: \"" va "\" --> \"" van "\"")); } # Update extremal values: if (van+0 < vmin) { vmin = van; } if (van+0 > vmax) { vmax = van; } if (dtn <= fdate) { printf "%s %s %s\n", dtn, tm, van; } if (dtn == fdate) { fNR = NR; } next; } // { data_error(("bad line format ")); } END { if (abort >= 0) { exit abort; } printf "value range = [ %s _ %s ]\n", vmin, vmax > "/dev/stderr"; if (fNR == "") { end_error(("date " fdate " not found")); } else { printf "date %s found on line %s\n", fdate, fNR > "/dev/stderr"; } } function arg_error(msg) { printf "** %s\n", msg > "/dev/stderr"; abort = 1; exit(abort); } function data_error(msg) { printf "%s:%s: ** %s\n", FILENAME, FNR, msg > "/dev/stderr"; printf " «%s»\n", $0 > "/dev/stderr"; abort = 1; exit(abort); } function data_warning(msg) { printf "%s:%s: !! warning: %s\n", FILENAME, FNR, msg > "/dev/stderr"; printf " «%s»\n", $0 > "/dev/stderr"; } function end_error(msg) { printf "** %s\n", msg > "/dev/stderr"; abort = 1; exit(abort); }