$ awk -f script.awk file
#filename seqno phasename corundum_a corundum_b corundum_c corundum_scale corundum_Rwp
blah_001.xye 1 corundum 3 3 12 0.001 3
blah_002.xye 2 corundum 3.1 3.1 12.1 0.002 3.5
blah_003.xye 3 corundum 3.2 3.2 12.2 0.001 3.1
#filename seqno phasename silcon_NIST_a silcon_NIST_b silcon_NIST_c silcon_NIST_scale silcon_NIST_Rwp
blah_001.xye 2 silcon_NIST 5.4 5.4 5.4 0.002 3
blah_002.xye 3 silcon_NIST 5.41 5.41 5.41 0.004 3.5
blah_003.xye 4 silcon_NIST 5.42 5.42 5.42 0.002 3.1
Onde script.awk
é
BEGIN { OFS = "\t" }
/^#/ {
# save header fields
for (i = 1; i <= NF; ++i)
header[i] = $i
next
}
# if column 2 contains a lower number than the previous line
# (or if no previous line with data), then output header
$2 < col2 || !col2 {
# output blank line if needed
if (print_blank) {
print ""
}
print_blank = 1
# print first three headers as-is
for (i = 1; i <= 3; ++i)
printf("%s%s", header[i], OFS)
# prepend column three to remaining headers
for (i = 4; i < NF; ++i)
printf("%s_%s%s", $3, header[i], OFS)
printf("%s_%s%s", $3, header[NF], ORS)
}
# print all lines and save value from column 2
{ col2 = $2; print }
O script salva o cabeçalho dos dados de entrada na matriz header
. Quando encontramos uma segunda coluna cujo valor é menor do que o valor da coluna dois da linha anterior, geramos um novo cabeçalho antes de gerar os dados. O cabeçalho é precedido por uma linha em branco, a menos que seja o primeiro cabeçalho. Os nomes das colunas variáveis recebem seus nomes do terceiro campo.
O script não usa parâmetros.