#! /usr/bin/gawk -f BEGIN { # OK is set to indicate normal exit ok = false; # Get command line args: if (ARGC != 3) { printf "usage: %s file1 file2\n" > "/dev/stderr"; exit 1; } file1 = ARGV[1] file2 = ARGV[2] ARGC = 1; # Table of changed characters: split("", change) split("", ch1) split("", ch2) # Loop on records: linect=0 while (1) { eof1 = ((getline rec1 < file1) <= 0); eof2 = ((getline rec2 < file2) <= 0); if (eof1 && eof2) { ok = 1; exit 0; } if (eof1 || eof2) { printf "unpaired lines\n" > "/dev/stderr"; exit 1; } linect++; n = length(rec1); if (length(rec2) != n) { printf "line lengths differ, line %d\n", linect > "/dev/stderr"; exit 1; } for (i=1;i<=n;i++) { c1 = substr(rec1, i, 1); c2 = substr(rec2, i, 1); changes[c1,c2]++; ch1[c1]++; ch2[c2]++; if ((c1 == " ") && (c2 == ":")) { printf "+" } else if ((c1 == ":") && (c2 == " ")) { printf "-" } else { printf "%s", c1 } } printf "\n" } } END { if (! ok) { exit 1; } e = "/dev/stderr"; for (c1 in ch1) { if (ch1[c1] == changes[c1,c1]) delete ch1[c1]; } for (c2 in ch2) { if (ch2[c2] == changes[c2,c2]) delete ch2[c2]; } printf " " > e; for (c2 in ch2) { printf " %5.5s", c2 > e; } printf "\n" > e; printf " " > e; for (c2 in ch2) { printf " %5.5s", "-----------" > e; } printf "\n" > e; for (c1 in ch1) { printf "%s |", c1 > e; for (c2 in ch2) { printf " %5d", changes[c1,c2] > e; } printf "\n" > e; } }