Réponses:
Vous aurez besoin de plus que la cat
commande, comme décrit ici :
Disons que vous avez 3 fichiers CSV: file1.csv
, file2.csv
et file3.csv
et que vous voulez les rejoindre à bigfile.csv
et 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 +2
ne 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' sed
incantation 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