Risposte:
Avrai bisogno di più del cat
comando, come descritto qui :
Diciamo che avete 3 CSV-files: file1.csv
, file2.csv
, e file3.csv
e si desidera unirsi a loro per bigfile.csv
e l'intestazione è sempre, quindi l'uso (solo) la prima linea
sia (mantenere intestazione dal primo file "file1.csv"):
cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
oppure (rimuovere l'intestazione da tutti i file i cui nomi iniziano con "file"):
awk 'FNR > 1' file*.csv > bigfile.csv
tail -n+2
, tail +2
non avrebbe funzionato
Sono d'accordo con la risposta principale ma suggerisco di estenderlo con il seguente scenario (in quanto non posso commentare):
Se si desidera che il file di output contenga l'intestazione (una volta) lo script corretto è:
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR rappresenta il numero del record elaborato in un singolo file. E NR lo rappresenta a livello globale, quindi la prima riga viene accettata e il resto viene ignorato come prima.
È inoltre possibile utilizzare un comando di gruppo ( { ; }
) anziché la sostituzione di processo ( <()
):
{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv
Funziona anche con i finali di riga CRLF purché i file terminino con una riga vuota ( \r\n
).
Le versioni solo numeriche di testa e coda sono state rese obsolete da POSIX 1003.1-2001 e generano avvisi in alcuni ambienti.
Necessario concatenare due CSV di grandi dimensioni con colonne identiche in CSV più grandi per lo script di suddivisione (i dati non hanno ID univoci).
In primo luogo ha preso l'intestazione dal secondo CSV
awk 'FNR > 1' file2.csv > file2_noheading.csv
Successivamente, concatenato tramite quanto segue
cat file1.csv file2_noheading.csv > newfile.csv
L'uso della sequenza di comandi sopra ha comportato un file simile al seguente:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Per renderlo un CSV corretto, con una riga di intestazione e tutti i valori pertinenti, ho utilizzato il seguente sed
incantesimo ...sed -ie "/^$/d;/^==>/d" bigfile.csv
Soluzione più semplice se hai un sacco di file:
awk 'FNR > 1' *.csv > merged.csv
Torna indietro per modificare il file di grandi dimensioni e aggiungere nuovamente l'intestazione.
awk 'FNR > 1' file*.csv > bigfile.csv
? Non è!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv