#! /usr/bin/gawk -f # Last edited on 2013-03-02 02:47:33 by stolfilocal BEGIN { FS = "|"; # These tables are indexed by "{dir}/{obj}": split("", k_dir); split("", k_obj); split("", k_zoom); split("", k_name); split("", k_cmt); nk = 0; # Number of distinct keys split("", keys); # Indexed by {1..nk}. } /^[ ]*([\#]|$)/ { next; } /[!].*[!].*[!].*[!]/ { next; } /[-]*[+][-]*[+][-]*[+][-]*[+]/ { next; } /[|]/ { # Num fields: if (NF != 5) { data_error(("bad num fields " NF)); } # Get fields dir = $1; obj = $2; zoom = $3; name = $4; cmt = $5; gsub(/^[\# ]*/, "", cmt); # Create key: key = sprintf("%s/%09d", dir, obj); if (key in k_obj) { # Repeated object, check/condense: if (dir != k_dir[key]) { prog_error("duh?"); } if (obj != k_obj[key]) { prog_error("deh?"); } k_zoom[key] = combine_zoom(k_zoom[key], zoom); k_name[key] = combine_name(k_name[key], name); k_cmt[key] = combine_comment(k_cmt[key], cmt); } else { # New object k_dir[key] = dir; k_obj[key] = obj; k_zoom[key] = zoom; k_name[key] = name; k_cmt[key] = cmt; nk++; keys[nk] = key; } next; } // { data_error(("bad format")); } END { printf "DIR!OBJ!ZOOM!NAME!\n" ; printf "--+--+--+--+\n" ; nnk = asort(keys); if (nk != nnk) { prog_error("boh?"); } for (i = 1; i <= nk; i++) { key = keys[i]; printf "%s|%s|%s|%s|", k_dir[key], k_obj[key], k_zoom[key], k_name[key]; if (k_cmt[key] != "") { printf " # %s\n", k_cmt[key]; } else { printf "\n"; } } printf "--+--+--+--+\n" ; } function combine_zoom(o_zoom, zoom) { if (o_zoom == "") { return zoom; } else if (zoom == "") { return o_zoom; } else { if (o_zoom != zoom) { data_warning(("inconsistent zoom = «" o_zoom "» «" zoom "»")); } return zoom; } } function combine_name(o_name, name) { if (o_name == "") { return name; } else if (name == "") { return o_name; } else { if (o_name != name) { data_warning(("inconsistent name = «" o_name "» «" name "»")); } return name; } } function combine_comment(o_cmt, cmt) { if (o_cmt == "") { return cmt; } else if (cmt == "") { return o_cmt; } else { if (o_cmt != cmt) { data_warning(("inconsistent cmt = «" o_cmt "» «" cmt "»")); } return cmt; } } function data_warning(msg) { printf "%s:%d: !! %s\n", FILENAME, FNR, msg > "/dev/stderr"; } function data_error(msg) { printf "%s:%d: ** %s\n", FILENAME, FNR, msg > "/dev/stderr"; printf " [%s]\n", $0 > "/dev/stderr"; abort = 1; exit abort; } function prog_error(msg) { printf "%s:%d: ** PROG ERROR: %s\n", FILENAME, FNR, msg > "/dev/stderr"; printf " [%s]\n", $0 > "/dev/stderr"; abort = 1; exit abort; }