diff options
Diffstat (limited to 'diff2.awk')
| -rw-r--r-- | diff2.awk | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/diff2.awk b/diff2.awk new file mode 100644 index 0000000..6086254 --- /dev/null +++ b/diff2.awk @@ -0,0 +1,97 @@ +#!/usr/bin/awk -f + +### diff2.awk +# print numerical second diff along columns +# dy[n] = y[n] - y[n-1] +# d2y[n] = dy[n] - dy[n-1] + + +BEGIN { + OFS = FS + sign = "[+-]?" + decimal = "[0-9]+[.]?[0-9]*" + fraction = "[.][0-9]*" + exponent = "([Ee]" sign "[0-9]+)?" + number = "^" sign "(" decimal "|" fraction ")" exponent "$" +} + + +# column headers +NR == 1 { + # orig data columns + for (n=1; n<=NF; n++) { + if ($n !~ number) { + header[n] = $n + dheader[n] = "d_" $n + d2header[n] = "d2_" $n + } + else { + header[n] = "col" n + dheader[n] = "d_col" n + d2header[n] = "d2_col" n + } + printf(header[n]) + printf(OFS) + } + + # new diff columns + for (n=1; n<=NF; n++) { + printf(dheader[n]) + printf(OFS) + } + + # new diff2 columns + for (n=1; n<=NF; n++) { + printf(d2header[n]) + printf(n < NF ? OFS : ORS) + } +} + + +NF > 0 { + (NF > nf_max) ? nf_max = NF : nf_max = nf_max + + # orig data columns + for (n=1; n<=nf_max; n++) { + if ($n == header[n] || $n == dheader[n]) + continue + if ($n ~ number) + printf(OFMT, $n) + else + printf("") + printf(OFS) + } + + # new diff columns + for (n=1; n<=nf_max; n++) { + if ($n == header[n] || $n == dheader[n]) + continue + if ($n ~ number) { + data[n] = $n + if (data_prev[n] ~ number) + diff[n] = data[n] - data_prev[n] + else + diff[n] = "" + data_prev[n] = data[n] + } + printf(diff[n]) + printf(OFS) + } + + # new diff2 columns + for (n=1; n<=nf_max; n++) { + if ($n == header[n] || $n == d2header[n]) + continue + if (diff[n] ~ number) { + #data[n] = $n + if (diff_prev[n] ~ number) + diff2[n] = diff[n] - diff_prev[n] + else + diff2[n] = "" + diff_prev[n] = diff[n] + } + printf(diff2[n]) + printf(n < nf_max ? OFS : ORS) + } +} + |
