Mesclando / unindo muitos arquivos csv com dígitos numéricos no nome do arquivo

2

Conforme processamos nossos dados csv, geramos muitos arquivos de saída com 30.000 linhas em cada um deles. Todos eles têm as mesmas colunas / campos. Eles também estão no formato csv e os colocamos na mesma pasta no servidor Linux. Os arquivos são nomeados exclusivamente usando uma combinação de data, hora e dígitos numéricos. Veja abaixo.

AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv
.
.
.
AB_20151127_120000_599_SEGMENT_FINAL.csv

Então, agora precisamos mesclar / unir todos eles em um grande arquivo chamado: AB_20151127_120000_SEGMENT_FINAL.csv (observe os dígitos numéricos ausentes do arquivo mesclado)

Eu tentei awk como abaixo, mas não está funcionando. Por favor, me diga o que fiz de errado.

awk '"AB_20151127_120000_" NR-1 "_SEGMENT_FINAL.csv"' > AB_20151127_120000_SEGMENT_FINAL.csv
    
por Gert Myburgh 09.12.2015 / 11:46

2 respostas

3

Se a ordem em que os arquivos são concatenados não for importante, use:

cat AB_20151127_120000_*_SEGMENT_FINAL.csv > AB_20151127_120000_SEGMENT_FINAL.csv

Se o pedido for importante, você terá que ser criativo. Se você sabe o número de segmentos, 599 por exemplo, você pode usar expansão de chave (o \ está lá apenas para me deixar imprimir o comando em duas linhas para facilitar a leitura):

cat AB_20151127_120000_{0..599}_SEGMENT_FINAL.csv > \
    AB_20151127_120000_SEGMENT_FINAL.csv

Se você não fizer isso, ainda poderá usar a expansão de chaves. Basta escolher um número grande o suficiente para garantir que todos os arquivos sejam incluídos e ignorar as mensagens de erro sobre arquivos inexistentes:

cat AB_20151127_120000_{0..599}_SEGMENT_FINAL.csv > \
    AB_20151127_120000_SEGMENT_FINAL.csv 2>/dev/null

Como alternativa, você pode gerar uma lista de nomes de arquivos classificados e usá-los:

cat $(printf '%s\n' AB_20151127_120000_*_SEGMENT_FINAL.csv | sort -nt_ -k4) > \
    AB_20151127_120000_SEGMENT_FINAL.csv

O printf imprimirá cada nome de arquivo seguido por uma nova linha que será passada para sort , que ordenará numericamente ( -n ) no quarto campo ( -t4 ) onde os campos são definidos por _ ( -t_ ).

    
por terdon 09.12.2015 / 12:44
0

Se você tiver acesso a um shell Zsh, a tarefa poderá ser reduzida a um único comando:

cat AB_20151127_120000_*(n)_SEGMENT_FINAL.csv >AB_20151127_120000_SEGMENT_FINAL.csv

Isso ocorre porque o qualificador% globing(n) força o padrão de globbing * a se expandir para uma lista de nomes de arquivos classificados em sua ordem natural, em oposição à ordem lexicográfica.

Para comparação, expansão de nome de arquivo no Bash:

$ for f in *; do echo "$f"; done
AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_10_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv

Expansão do nome de arquivo no Zsh usando o qualificador (n) globbing:

% for f in *(n); do echo "$f"; done
AB_20151127_120000_0_SEGMENT_FINAL.csv
AB_20151127_120000_1_SEGMENT_FINAL.csv
AB_20151127_120000_2_SEGMENT_FINAL.csv
AB_20151127_120000_3_SEGMENT_FINAL.csv
AB_20151127_120000_10_SEGMENT_FINAL.csv
    
por kos 09.12.2015 / 14:05