Réponses:
Vous aurez besoin de plus que la catcommande, comme décrit ici :
Disons que vous avez 3 fichiers CSV: file1.csv, file2.csvet file3.csvet que vous voulez les rejoindre à bigfile.csvet votre tête est toujours (seulement) la première ligne, puis utiliser
soit (conserver 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 "fichier"):
awk 'FNR > 1' file*.csv > bigfile.csv
tail -n+2, ça tail +2ne marcherait pas
Je suis d'accord avec la réponse du haut mais je suggère de l'étendre avec le scénario suivant (car je ne peux pas commenter):
Si vous voulez que le fichier de sortie contienne (une fois) l'en-tête, 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 les autres sont ignorées comme auparavant.
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ériques de la tête et de la queue ont été rendues obsolètes par POSIX 1003.1-2001 et entraînent des avertissements dans certains environnements.
Nécessaire pour concaténer deux grands CSV avec des colonnes identiques dans un CSV plus grand pour le script de segmentation (les données n'ont pas d'ID unique).
Première prise d'en-tête sur la seconde csv
awk 'FNR > 1' file2.csv > file2_noheading.csv
Ensuite, concaténé via ce qui suit
cat file1.csv file2_noheading.csv > newfile.csv
L'utilisation de la séquence de commandes ci-dessus a donné un fichier ressemblant à ceci:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Pour en faire un CSV correct, avec une ligne d'en-tête et toutes les valeurs pertinentes, j'ai utilisé l' sedincantation suivante ...sed -ie "/^$/d;/^==>/d" bigfile.csv
Solution plus simple si vous avez une tonne de fichiers:
awk 'FNR > 1' *.csv > merged.csv
Revenez simplement pour modifier le gros fichier et ajoutez l'en-tête.
awk 'FNR > 1' file*.csv > bigfile.csv? Ce n'est pas!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv