Mesclando vários arquivos CSV sem mesclar o cabeçalho

20

Preciso mesclar vários arquivos .CSV (usando o catcomando), mas sem copiar o cabeçalho de cada arquivo.

Qual é a melhor maneira de realizar essa tarefa?

Dranian
fonte

Respostas:

32

Você precisará de mais do que o catcomando, conforme descrito aqui :

Digamos que você tenha 3 CSV-arquivos: file1.csv, file2.csve, file3.csve quer se juntar a eles para bigfile.csve seu cabeçalho é sempre (apenas) a primeira linha, em seguida, uso

(mantenha o cabeçalho do primeiro arquivo "file1.csv"):

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

ou (remova o cabeçalho de todos os arquivos cujos nomes começam com "arquivo"):

awk 'FNR > 1' file*.csv > bigfile.csv
iolsmit
fonte
4
Achei isso procurando uma resposta genérica para o Linux, mas no meu caso isso não funcionou exatamente. Ignoraria silenciosamente o arquivo1.csv. Eu precisava criar esse arquivo. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon
Estou recebendo tail + 2: comando não encontrado quando eu usei o método cat <file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv)> bigfile.csv
@ user64636 deve haver um caractere de espaço entre tail e +2
nohillside
na verdade, eu tive que usar tail -n+2, tail +2não iria funcionar
Matthieu Napoli
11

Concordo com a resposta principal, mas sugiro estendê-la com o seguinte cenário (como não posso comentar):

Se você deseja que o arquivo de saída contenha cabeçalho (uma vez), o script correto é:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR representa o número do registro processado em um único arquivo. E a NR a representa globalmente, então a primeira linha é aceita e o restante é ignorado como antes.

Marek Grác
fonte
6

Você também pode usar um comando de grupo ( { ; }) em vez de substituição de processo ( <()):

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

Também funciona com terminações de linhas CRLF desde que os arquivos terminem com uma linha vazia ( \r\n).

As versões somente em número de cabeça e cauda foram tornadas obsoletas pelo POSIX 1003.1-2001 e resultam em avisos em alguns ambientes.

Lri
fonte
2

Necessário concatenar dois CSVs grandes com colunas idênticas em CSV maior para script de chunking (os dados não possuem IDs exclusivos).

Primeiro tirou o cabeçalho do segundo csv

awk 'FNR > 1' file2.csv > file2_noheading.csv

Em seguida, concatenado através dos seguintes

cat file1.csv file2_noheading.csv > newfile.csv
mcconnelljk
fonte
1

O uso da sequência de comandos acima resultou em um arquivo parecido com este:

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

Para torná-lo um CSV adequado, com uma linha de cabeçalho e todos os valores relevantes, empreguei o seguinte sedencantamento ...sed -ie "/^$/d;/^==>/d" bigfile.csv

hd1
fonte
0

Solução mais fácil se você tiver uma tonelada de arquivos:

awk 'FNR > 1' *.csv > merged.csv

Volte para editar o arquivo grande e adicione o cabeçalho novamente.

Brian
fonte
Qual é a sua resposta diferente do que estava pronto apresentado pela iolsmit em 2013 awk 'FNR > 1' file*.csv > bigfile.csv? Não é!
user3439894
Re: como é que é diferente? É uma resposta mais concisa e aquele que eu copiado e colado, pelo menos:) Obtém o meu upvote
Rick Davies
Esta é uma resposta boa, porque você não precisa de todos os arquivos para começar comfile
big_smile