Manipulando dinamicamente as posições das colunas e dividindo o arquivo

3

Eu tenho um problema único. Eu tenho um arquivo com as seguintes colunas

PersonId, AB1, AB2, AB3, DG1_B1,DG1_B2,DG2
1,0,1,0,3,5,7
2,0,3,1,3,7,4

Eu quero dividir isso e criar vários arquivos com base no prefixo da coluna. Eu quero que a saída seja como segue

  • File_AB1.csv

    PersonId, AB1, AB2, AB3
    1,0,1,0
    2,0,3,1
    
  • File_DG1.csv

    PersonId, DG1_B1,DG1_B2
    1,3,5
    2,3,7
    
  • File_DG2.csv

    PersonId, DG2
    1,7
    2,4
    

Existe outro problema com este arquivo também. A ordenação das colunas pode mudar na próxima vez que eu obtiver o arquivo de entrada como mostrado abaixo (observe a coluna AB3 movida para o final da linha).

PersonId, AB1, AB2,DG1_B1,DG1_B2,DG2,AB3
1,0,1,3,5,7,0
2,0,3,3,7,4,1

Como posso conseguir isso no awk?

    
por user2552537 13.08.2014 / 11:32

1 resposta

3

Você pode fazer algo como:

awk -F, '
  NR == 1 {
    for (i = 2; i <= NF; i++)
      if (match($i, /AB|DG./))
        file_list[file[i] = "file_" substr($i, RSTART, RLENGTH) ".csv"]
  }
  {
    for (f in file_list) printf "%s", $1 > f
    for (i = 2; i <= NF; i++) printf ",%s", $i > file[i]
    for (f in file_list) print "" > f
  }'

(chama o arquivo file_AB.csv (baseado no prefixo), não file_AB1.csv )

    
por 13.08.2014 / 12:24