Altera Colunas em arquivos .csv para que sejam todos iguais

1

Eu tenho 20 arquivos excel com 6x6 linhas e colunas, onde a primeira linha e coluna são cabeçalhos de string. Cada um desses arquivos tem 4 mesmas colunas e cabeçalhos de linha, exceto 1 diferente. Eu quero saber como eu posso modificá-los para que as colunas e linhas com o mesmo cabeçalho em cada arquivo tenham a mesma ordem, enquanto as diferentes linhas e colunas sempre serão as últimas.

Então, por exemplo:

Se a.csv for assim:

    a   b   d   c   x
a   1   2   3   5   3
b   2   2   5   5   2
d   2   3   4   4   6
c   5   5   6   6   5
x   3   1   6   7   9

e b.csv são assim:

    d   c   b   a   y
d   2   3   6   5   3
c   5   2   6   6   5
b   6   4   2   3   4
a   6   4   4   6   2
y   5   3   6   7   9

e c.csv são assim:

    a   c   d   b   z
a   3   3   5   5   2
c   5   4   6   6   1
d   7   4   5   7   2
b   3   2   6   6   7
z   5   3   6   4   7

e assim por diante .... para todos os 20 arquivos

É assim que eu quero que eles pareçam:

a.csv :

    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

b.csv :

    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

mesmo com c.csv e o resto dos arquivos do Excel.

    
por Tak 13.04.2015 / 11:34

1 resposta

3

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
    
por 13.04.2015 / 15:09

Tags