#!/usr/bin/awk -f ### diff.awk # numerical diff along columns BEGIN { sign = "[+-]?" decimal = "[0-9]+[.]?[0-9]*" fraction = "[.][0-9]*" exponent = "([Ee]" sign "[0-9]+)?" number = "^" sign "(" decimal "|" fraction ")" exponent "$" } NR == 1 { header_nf = NF for (n=1; n<=NF; n++) { printf("%s", $n) ($n !~ number) ? dheader[n] = "d" $n : dheader[n] = "dcol_" n if (n <= NF) printf("%s", OFS) } for (n=1; n<=NF; n++) { printf("%s", dheader[n]) if (n < NF) printf("%s", OFS) } } NF != 0 { if (NF > max_nf) max_nf = NF ### iterate over columns for (y=1; y<=max_nf; y++) { if (match(dheader[y], $y)) continue if ($y ~ number) printf("%g", $y) if (y <= max_nf) printf("%s", OFS) } for (y=1; y<=max_nf; y++) { if ($y ~ number) { data[y] = $y (data_prev[y] ~ number) ? diff[y] = data[y] - data_prev[y] : diff[y] = "nan" data_prev[y] = data[y] printf("%g", diff[y]) if (y < max_nf) printf("%s", OFS) } } printf("\n") }