Cole diferentes arquivos csv

1

Eu tenho vários arquivos csv de entrada (delimitados por ponto-e-vírgula " ; " com o seguinte formato

YEAR;MONTH;DAY;RES1FILE1;RES2FILE1;RES3FILE1
1901;01;01;101;154;169
1901;01;02;146;174;136

O número de colunas para cada arquivo é variável, o que significa que alguns arquivos podem ter 6 colunas e outros 4.

Eu gostaria de colar cada arquivo em um grande arquivo csv (com " ; " como um delimitador. Meu problema é que, para evitar redundância, eu gostaria de evitar colar as três primeiras colunas de cada vez desde para todos os arquivos, eles são iguais ( YEAR;MONTH;DAY ).

Portanto, a saída deve ficar assim:

YEAR;MONTH;DAY;RES1FILE1;RES2FILE1;RES3FILE1;RES1FILE2;RES2FILE2
1901;01;01;101;154;169;185;165
1901;01;02;146;174;136;129;176

No momento, estou usando o seguinte comando:

arr=( *_rcp8p5.csv )
paste "${arr[@]}" | cut -f-4,$(seq -s, 8 4 $((4*${#arr[@]}))) >out_rcp8p5.txt

Mas não está funcionando de todo

    
por steve 09.08.2016 / 15:17

1 resposta

2

Posso pensar em duas maneiras de abordar isso:

  1. implemente sua própria 'pasta' que pula os três primeiros campos de todos, menos o primeiro arquivo - por exemplo

    awk -F\; '
      FNR==NR {
        a[FNR]=$0; next;
      }
      {
        for (i=4;i<=NF;i++) a[FNR] = sprintf("%s;%s", a[FNR], $i);
      } 
      END {
        for (n=1;n<=FNR;n++) print a[n];
      }' file*.csv
    
  2. cole os arquivos juntos e retenha os campos com base em um indicador derivado da linha de cabeçalho

    paste -d\; file*.csv | 
      perl -MList::MoreUtils=indexes -F\; -alne '
        @keep = indexes { $_ !~ /YEAR|MONTH|DAY/ } @F if $. == 1; 
        print join ";", @F[0..2,@keep]'
    

    (se você não tem o módulo List::MoreUtils , você deve ser capaz de implementar a mesma funcionalidade usando grep do perl).

por 09.08.2016 / 22:42