Para qualquer pedido fixo por chamada (a, b, c, d, no seu exemplo), você pode usar, por exemplo, um programa awk
como este para realizar a tarefa:
awk -v order=',a,b,c,d' '
BEGIN {
OFS = FS = "\t"
n = split(order,ord,",")
for (i=1; i<=n; i++) ind[ord[i]] = i
}
FNR==1 {
for (i=2; i<=n; i++) prm[ind[$i]] = i
}
{
out[$1] = sprintf("%s", $1)
for (i=2; i<=n; i++) {
out[$1] = out[$1] sprintf("%s%s", OFS, $prm[i])
}
out[$1] = out[$1] sprintf("%s%s", OFS, $NF)
}
ENDFILE {
for (i=1; i<=n; i++) print out[ord[i]]
print out[$1] ORS
}
' a.csv b.csv c.csv
Nota: Este código assume uma versão recente (4.x) do GNU awk devido à condição ENDFILE
. (Se isso não estiver disponível, a solução requer um ajuste.)
Nota 2: Se você quiser processar os arquivos individualmente (um arquivo de dados por awk
call), você pode substituir ENDFILE
por END
(que também será executado em awk
s).
Os resultados para os dados da sua amostra são:
a b c d x
a 1 2 5 3 3
b 2 2 5 5 2
c 5 5 6 6 5
d 2 3 4 4 6
x 3 1 7 6 9
a b c d y
a 6 4 4 6 2
b 3 2 4 6 4
c 6 6 2 5 5
d 5 6 3 2 3
y 7 6 3 5 9
a b c d z
a 3 5 3 5 2
b 3 6 2 6 7
c 5 6 4 6 1
d 7 7 4 5 2
z 5 4 3 6 7