#! /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;
}