#!/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) } }