J'ai besoin de fusionner plusieurs fichiers .CSV (à l'aide de la cat
commande) 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 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
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
tail -n+2
, çatail +2
ne marcherait pasJe 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.
la source
Vous pouvez également utiliser une commande de groupe (
{ ; }
) au lieu de la substitution de processus (<()
):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.
la source
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
Ensuite, concaténé via ce qui suit
la source
L'utilisation de la séquence de commandes ci-dessus a donné un fichier ressemblant à ceci:
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
la source
Solution plus simple si vous avez une tonne de fichiers:
Revenez simplement pour modifier le gros fichier et ajoutez l'en-tête.
la source
awk 'FNR > 1' file*.csv > bigfile.csv
? Ce n'est pas!file