#!/usr/bin/awk -f BEGIN { FS = ":"; OFS = ":"; } function mystrtonum(str, ret, chars, n, i, k, c) { if (str ~ /^0[0-7]*$/) { # octal n = length(str) ret = 0 for (i = 1; i <= n; i++) { c = substr(str, i, 1) if ((k = index("01234567", c)) > 0) k-- # adjust for 1-basing in awk ret = ret * 8 + k } } else if (str ~ /^0[xX][[:xdigit:]]+/) { # hexadecimal str = substr(str, 3) # lop off leading 0x n = length(str) ret = 0 for (i = 1; i <= n; i++) { c = substr(str, i, 1) c = tolower(c) if ((k = index("0123456789", c)) > 0) k-- # adjust for 1-basing in awk else if ((k = index("abcdef", c)) > 0) k += 9 ret = ret * 16 + k } } else if (str ~ \ /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) { # decimal number, possibly floating point ret = str + 0 } else ret = "NOT-A-NUMBER" return ret } function parse(id, value) { sub(/^ +/, "", value); sub(/ +$/, "", value); caption = value; sub(/\[.*/, "", caption); sub(/ +$/, "", caption); print "opis-skali", 3, "analog " id, "\"" caption "\""; value = substr(value, length(caption) + 1); unit_value_str = ""; if (value ~ /\[/) { sub(/.*\[/, "", value); sub(/^ +/, "", value); sub(/1?dz/, "", value); sub(/^ *\. */, "", value); sub(/^ *- */, "", value); sub(/^ *= */, "", value); sub(/\].*$/, "", value); sub(",", ".", value); unit_value_str = value; sub(/[^0-9\.]*$/, "", unit_value_str); } if (!length(unit_value_str)) unit_value_str = "1"; unit_value = mystrtonum(unit_value_str); print "opis-skali", 3, "analog skala " id, unit_value; if (unit_value != 0) { unit_value = 10 * 128 / unit_value; print "opis-skali", 3, "analog unit_value " id, unit_value; } unit = value; sub(/^[0-9\. ]*/, "", unit); print "opis-skali", 3, "analog jedn " id, "\"" unit "\""; } { source=$1; prio=$2; param=$3; value=$4; print; if (param ~ /^opis skali/) { sub(/^opis skali /, "", param); num = 2 * param; sub(/^"/, "", value); sub(/"$/, "", value); sep=" "; for (sep = " ";; sep = sep " ") { split(value, analogs, sep " +"); if (3 in analogs) continue; parse(num + 0, analogs[1]); if (2 in analogs) parse(num + 1, analogs[2]); break; } } }