#!/bin/awk -f function dbg( text ) { print text >>"/dev/stderr"; } function STRING( inp ) { gsub(/\\/, "\\\\", inp); gsub(/\n/, "\\n", inp); gsub(/\r/, "\\r", inp); gsub(/\t/, "\\t", inp); gsub(/\+/, "\\+", inp); gsub(/ /, "+", inp); return inp ? inp : "\\"; } function UNSTRING( inp, out, tmp ) { while ( inp ) { if ( inp ~ /^\\\\/) { out = out "\\"; sub(/^\\\\/, "", inp); } else if ( inp ~ /^\\n/) { out = out "\n"; sub(/^\\n/, "", inp); } else if ( inp ~ /^\\r/) { out = out "\r"; sub(/^\\r/, "", inp); } else if ( inp ~ /^\\t/) { out = out "\t"; sub(/^\\t/, "", inp); } else if ( inp ~ /^\\+/) { out = out "+"; sub(/^\\+/, "", inp); } else if ( inp ~ /^\+/) { out = out " "; sub(/^\+/, "", inp); } else if ( inp ~ /^\\/) { out = out ""; sub(/^\+/, "", inp); } else { tmp = inp; sub(/[\\+].*$/, "", tmp); out = out tmp; sub(/^[^\\+]*/, "", inp); } } return out; } function rx( regex ) { gsub(/[].*+?^${}()|\\[]/, "\\\\&", regex); return regex; } BEGIN { FS = " "; ledger = 0; fn = n = uid = iban = tmp = ""; split("", uid_n); split("", uid_fn); split("", uid_iban); split("", iban_uid); split("", ibans); split("", uids); split("", sure); split("", unsure); split("", unknown); split("", unsure_rec) } /^BEGIN;:VCARD$/ { fn = n = id = iban = tmp = ""; } /^UID;[^:]*:/ { uid = $0; sub(/^[^;]+;[^:]*:/, "", uid); } /^FN;[^:]*:/ { fn = $0; sub(/^[^;]+;[^:]*:/, "", fn); } /^N;[^:]*:/ { n = $0; sub(/^[^;]+;[^:]*:/, "", n); sub(/;.*$/, "", n); } /^X-IBAN;[^:]*:/ { iban = $0; sub(/^[^;]+;[^:]*:/, "", iban); ibans[length(ibans)] = iban; } /^END;:VCARD$/ { uid_n[uid] = n; uid_fn[uid] = fn; uid_iban[uid] = iban; for (iban in ibans) iban_uid[ibans[iban]] = iban_uid[ibans[iban]] ? iban_uid[ibans[iban]] " " uid : uid; fn = n = uid = iban = tmp = ""; split("", ibans); } /^BEGIN:LEDGERS$/ { ledger = 1; } ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 { if ($3 in iban_uid) { sure[$3] = iban_uid[$3]; } else { for (uid in uid_fn) if ( match(UNSTRING($5), rx(uid_fn[uid])) ) { if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid; unsure_rec[$3] = $0 } for (uid in uid_n) if ( uid_n[uid] && match(UNSTRING($4), rx(uid_n[uid])) ) { if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid; unsure_rec[$3] = $0 } } if (!($3 in sure) && !($3 in unsure)) unknown[$3] = $0; } END { for (iban in unsure) { line = "guess " iban " " STRING(unsure_rec[iban]); split(unsure[iban], uids, / /); for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]); print line; } for (iban in unknown) { line = "unknown " iban " " unknown[iban]; print line; } for (iban in sure) { line = "sure " iban; split(sure[iban], uids, / /); for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]); print line; } }