J'ai besoin de fusionner plusieurs fichiers .CSV (à l'aide de l'outil de gestion de l'information). cat
) mais sans copier l'en-tête de chaque fichier.
Quelle est la meilleure façon d'accomplir cette tâche ?
J'ai besoin de fusionner plusieurs fichiers .CSV (à l'aide de l'outil de gestion de l'information). cat
) mais sans copier l'en-tête de chaque fichier.
Quelle est la meilleure façon d'accomplir cette tâche ?
Vous aurez besoin de plus que le cat
comme décrit ici :
Disons que vous avez 3 fichiers CSV : file1.csv
, file2.csv
et file3.csv
et veulent les rejoindre pour bigfile.csv
et que votre en-tête est toujours (uniquement) la première ligne, alors utilisez
soit (garder l'en-tête du premier fichier "file1.csv") :
cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
ou (supprimer l'en-tête de tous les fichiers dont le nom commence par "file") :
awk 'FNR > 1' file*.csv > bigfile.csv
J'ai trouvé ceci en cherchant une réponse générique pour Linux, mais dans mon cas, cela n'a pas vraiment fonctionné. Il ignorait silencieusement file1.csv. J'avais besoin d'attraper ce fichier. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Je suis d'accord avec la première réponse mais je suggère de l'étendre avec le scénario suivant (car je ne peux pas faire de commentaires) :
Si vous voulez que le fichier de sortie contienne un en-tête (une fois), le script correct est :
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR représente le numéro de l'enregistrement traité dans un seul fichier. Et NR le représente globalement, donc la première ligne est acceptée et le reste est ignoré comme avant.
Vous pouvez également utiliser une commande de groupe ( { ; }
) au lieu de la substitution de processus ( <()
) :
{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv
Il fonctionne également avec les fins de ligne CRLF tant que les fichiers se terminent par une ligne vide ( \r\n
).
Les versions numérotées de head et tail ont été rendues obsolètes par POSIX 1003.1-2001, et elles entraînent des avertissements dans certains environnements.
Nécessité de concaténer deux grands CSV avec des colonnes identiques dans un plus grand CSV pour le chunking script (les données n'ont pas d'identifiants uniques).
Le premier a retiré l'en-tête du second csv.
awk 'FNR > 1' file2.csv > file2_noheading.csv
Ensuite, concaténation par le biais de ce qui suit
cat file1.csv file2_noheading.csv > newfile.csv
En utilisant la séquence de commandes ci-dessus, on obtient un fichier ressemblant à ceci :
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Pour en faire un vrai CSV, avec une ligne d'en-tête et toutes les valeurs pertinentes, j'ai employé ce qui suit sed
incantation... sed -ie "/^$/d;/^==>/d" bigfile.csv
LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.