Linux / Commande paste : assembler les lignes de plusieurs fichiers

paste assemble côte à côte les lignes qui occupent la même position dans plusieurs fichiers. Il sépare les colonnes par une tabulation par défaut ; -d change ce séparateur et -s réunit les lignes d'un fichier sur une seule ligne. Il associe des positions, sans rechercher de clé commune entre les enregistrements.

Cette distinction est utile avant toute fusion de données. La concaténation avec cat place les contenus à la suite, tandis que paste associe la première ligne du premier fichier à la première du second, puis fait de même pour les suivantes. Des lignes mal alignées peuvent produire un résultat incorrect sans erreur de commande.

Syntaxe et fichiers d'exercice

paste [options] [fichiers…]

La sortie est envoyée au terminal, sans modifier les fichiers d'entrée. Un argument - représente l'entrée standard. Consultez man paste pour connaître les options de votre système.

Dans Bash, créez un répertoire neuf et deux fichiers de même longueur :

paste_lab=$(mktemp -d "$HOME/paste-lab.XXXXXX")
cd -- "$paste_lab"
printf 'Ana\nBob\n' > names.txt
printf '7\n12\n' > scores.txt

Le répertoire propre à l'exercice évite d'utiliser vos données réelles. Notez son chemin pour retrouver les fichiers ; vous pourrez ensuite le quitter avec cd "$HOME". Ici, l'ordre des noms correspond volontairement à celui des scores : Ana a 7, Bob a 12.

Assembler deux fichiers par position

paste names.txt scores.txt

Le résultat contient deux lignes avec une tabulation entre les valeurs. L'espacement visible dépend des taquets de tabulation du terminal :

Ana	7
Bob	12

Pour obtenir un séparateur explicitement visible, remplacez la tabulation par un deux-points :

paste -d ':' names.txt scores.txt
Ana:7
Bob:12

Les fichiers restent inchangés. Si scores.txt était classé dans un autre ordre que les noms, paste n'aurait aucun moyen de retrouver le bon score. Vérifiez la correspondance des données en amont ; un nombre de lignes identique ne prouve pas que chaque paire concerne le même objet.

Comprendre les entrées de longueurs différentes

Préparez un fichier de scores qui ne contient qu'une ligne, puis refaites la fusion :

printf '7\n' > scores-short.txt
paste -d ':' names.txt scores-short.txt
Ana:7
Bob:

La colonne du deuxième fichier devient vide pour Bob. La sortie continue tant qu'au moins l'un des fichiers fournit une ligne ; ce remplissage n'est pas un contrôle de validité des données. Une ligne vide présente dans un fichier occupe elle aussi une position et peut décaler l'interprétation des associations.

Réunir les lignes d'un fichier avec -s

-s traite un fichier à la fois et remplace ses séparations entre lignes par le séparateur choisi :

paste -s -d ',' names.txt
Ana,Bob

Avec plusieurs fichiers, cette option produit une ligne distincte pour chaque fichier, et non une seule ligne qui mélange toutes les entrées :

paste -s -d ',' names.txt scores.txt
Ana,Bob
7,12

Une virgule de séparation ne suffit pas à fabriquer un CSV correct pour toutes les données. Si une valeur contient elle-même une virgule, des guillemets ou un retour à la ligne, il faut appliquer les règles d'échappement du format avec un outil CSV adapté.

Utiliser une liste de séparateurs

L'argument de -d est une liste de caractères utilisés successivement, et non une chaîne complète insérée entre chaque colonne. Ajoutez un troisième fichier pour voir la différence :

printf 'A\nB\n' > groups.txt
paste -d ':;' names.txt scores.txt groups.txt
Ana:7;A
Bob:12;B

Le premier séparateur est :, le second est ;. En mode parallèle normal, la liste recommence au début pour chaque ligne de sortie. Si davantage de séparateurs sont nécessaires sur une ligne, la liste est réutilisée à partir de son début. Pour un seul séparateur répété, fournissez simplement un caractère, comme dans -d ':'.

Lire l'entrée standard et utiliser Bash

Un tiret à la place d'un fichier permet de combiner un tube avec un fichier existant :

printf 'Ana\nBob\n' | paste -d ':' - scores.txt

La sortie est encore Ana:7 puis Bob:12. Plusieurs arguments - lisent successivement le même flux standard ; ils ne dupliquent pas ce flux. Cette propriété permet de regrouper les lignes d'une seule entrée par paires :

printf '1\n2\n3\n4\n' | paste -d ':' - -
1:2
3:4

La substitution de processus de Bash permet aussi de fournir deux commandes comme entrées sans créer vous-même deux fichiers :

paste -d ',' <(printf 'Ana\nBob\n') <(printf '7\n12\n')
Ana,7
Bob,12

La syntaxe <(...) appartient au shell et n'est pas une option de paste. Elle demande Bash ou un autre shell qui la prend en charge ; un shell uniquement POSIX ne la comprend pas nécessairement. Dans ce cas, utilisez les fichiers de l'exercice précédent.

Choisir paste, cat ou join et conserver le résultat

Outil ou option Besoin traité
paste Mettre côte à côte les lignes de même position.
paste -s Réunir les lignes de chaque fichier sur sa propre ligne.
paste -d liste Choisir les caractères séparant les valeurs.
cat Écrire le contenu des fichiers à la suite.
join Associer des lignes par une valeur de champ commune, avec les conditions de tri nécessaires.

Si la correspondance repose sur un identifiant présent dans chaque fichier, choisissez un outil qui traite cette clé, comme join, et vérifiez ses conditions de tri. N'essayez pas de remplacer une association par clé par un simple alignement de numéros de ligne.

Pour enregistrer une fusion validée, choisissez un nouveau fichier de sortie :

paste -d ':' names.txt scores.txt > names-scores.txt
cat names-scores.txt

Vous obtenez les deux lignes Ana:7 et Bob:12. Ne choisissez pas un fichier d'entrée comme destination de la redirection : le shell peut le vider avant sa lecture. Pour vérifier les détails des séparateurs, du mode séquentiel et de l'entrée standard, consultez le manuel officiel de GNU paste.