#! /usr/bin/gawk -f # Last edited on 2011-06-05 10:37:48 by stolfi BEGIN { abort = -1; clear_entry(); oht = -99999.0; onf = -1; FS = "|"; OFS = "|"; } # Save the unformatted line for error case's sake: // { lin = $0; } (abort >= 0) { print; next; } /^[ ]*([\#]|$)/ { print; next; } /^201[1-9]/ { gsub(/[ ]/, "", $0); if (NF < 6) { data_error(("wrong field count = " NF)); } if (onf < 0) { onf = NF; } else { if (NF != onf) { data_error(("inconsisent field count " onf " " NF)); } } if ($(NF) != "") { data_error(("last field should be empty, is \"" $(NF) "\"")); } dt = $1; hr = $2; ht = $3; tg = $(NF-1); if (ht !~ /^[0-9]+[.][0-9]+$/) { data_error(("invalid time format")); } ht = ht + 0.0; if (ht != oht) { if (ht < oht) { data_error(("out of order " odt " " ohr " " oht " : " dt " " hr " " ht)); } if (odt != "") { print_entry(); } clear_entry(); } merge_entries(); next; } // { data_error(("invalid line format")); } END { if (odt != "") { print_entry(); } } function clear_entry( i) { odt = ""; ohr = ""; otg = ""; split("", ofv); # Field values. for (i = 4; i <= onf-2; i++) { ofv[i] = "99999"; } } function merge_entries( i,fvi) { if (odt == "") { odt = dt; ohr = hr; oht = ht; otg = tg; } else { if (dt != odt) { data_error(("inconsistent dates")); } if (hr != ohr) { data_error(("inconsistent times-of-day")); } otg = (otg "," tg); } for (i = 4; i <= onf-2; i++) { fvi = $(i); if (fvi == ofv[i]) { } else if (ofv[i] == "99999") { ofv[i] = fvi; } else if (fvi == "99999") { } else { data_error(("inconsistent values" ofv[i] " " fvi)); } } } function print_entry( i) { printf "%s | %s | %8.3f |", odt, ohr, oht; for (i = 4; i <= onf-2; i++) { printf " %5s |", ofv[i]; } printf " %s |", otg; printf "\n"; fflush(); } function data_error(msg) { if (odt != "") { print_entry(); } clear_entry(); printf " %s\n", lin > "/dev/stderr"; printf "%d: **%s\n", FNR, msg > "/dev/stderr"; abort = 1; exit abort; } function arg_error(msg) { printf "**%s\n", msg > "/dev/stderr"; abort = 1; exit abort; }