Eu não vejo como você poderia fazer isso no Awk sem usar arrays. Seria mais conveniente em Gawk, o que permite que elementos de array sejam arrays, mas é bastante fácil de fazer com arrays multidimensionais simulados do Awk comuns.
Basicamente, precisamos nos lembrar das linhas de entrada e então produzi-las (com os campos F-I atualizados) quando a chave é alterada. Também precisamos fazer isso no final do arquivo. Por conveniência, usamos uma função de saída, pois ela será inevitavelmente chamada de dois lugares.
O seguinte usa números de coluna fixos: 1-6 e 11-12 para os campos de dados padrão, com 4 sendo o campo-chave e 7-10 para os campos mesclados, que eu chamei de tags por falta de um nome melhor. Isso não é ótimo estilo, e provavelmente deve ser fatorado em algumas variáveis.
awk -F '\t' '
function show_and_reset( i, c) {
for (i = 1; i <= count; ++i) {
for (c = 1; c <= 6; ++c) printf "%s\t", data[i,c]
for (f in tags) printf "%s\t", f;
for (c = ntags; c <= 3; ++c) printf "\t"
for (c = 11; c <= 12; ++c) printf "\t%s", data[i,c]
print ""
}
/* Clear the holding data */
for (f in tags) delete tags[f]
ntags = 0;
count = 0
}
/* Record one line of data */
function record( c) {
++count;
for (c = 1; c <= 6; ++c) data[count,c] = $c
for (c = 11; c <= 12; ++c) data[count,c] = $c
for (c = 6; c <= 10; ++c)
if ($c != "" && !tags[$c]++) ++ntags;
}
$4 != key { show_and_reset(); key = $4; }
{ record(); }
END { show_and_reset(); }
'