#!/usr/bin/awk -f ### diff.awk # numerical diff along columns BEGIN { OFMT = "%.9g" sign = "[+-]?" decimal = "[0-9]+[.]?[0-9]*" fraction = "[.][0-9]*" exponent = "([Ee]" sign "[0-9]+)?" number = "^" sign "(" decimal "|" fraction ")" exponent "$" } NR == 1 { ### orig columns for (n=1; n<=NF; n++) { ($n !~ number) ? header[n] = $n : header[n] = "col" n printf(header[n]) ($n !~ number) ? dheader[n] = "d" $n : dheader[n] = "dcol" n if (n <= NF) printf(OFS) } ### diff columns for (n=1; n<=NF; n++) { printf(dheader[n]) if (n < NF) printf(OFS) } } NF { if (NF > nf_max) nf_max = NF ### orig columns for (y=1; y<=nf_max; y++) { if ($y == header[y] || $y == dheader[y]) continue if ($y ~ number) printf($y) else printf("") printf(OFS) } ### diff columns for (y=1; y<=nf_max; y++) { if ($y ~ number) { data[y] = $y (data_prev[y] ~ number) ? diff[y] = data[y] - data_prev[y] : diff[y] = "" data_prev[y] = data[y] printf(diff[y]) if (y < nf_max) printf(OFS) } diff[y] = "" } printf("\n") }