94 votes

Comment entrelacer les lignes de deux fichiers texte

Quel est le moyen le plus simple et le plus rapide d'entrelacer les lignes de deux (ou plusieurs) fichiers texte ? Exemple :

Dossier 1 :

line1.1
line1.2
line1.3

Dossier 2 :

line2.1
line2.2
line2.3

Entrelacé :

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

Bien sûr, il est facile d'écrire un petit script Perl qui les ouvre tous les deux et effectue la tâche. Mais je me demandais s'il était possible de s'en sortir avec moins de code, peut-être une ligne unique en utilisant les outils Unix ?

178voto

codaddict Points 154968
paste -d '\n' file1 file2

11voto

samgak Points 52

Voici une solution utilisant awk :

awk '{print; if(getline < "file2") print}' file1

produit cette sortie :

line 1 from file1
line 1 from file2
line 2 from file1
line 2 from file2
...etc

Utilisation de awk peut être utile si vous voulez ajouter un formatage supplémentaire à la sortie, par exemple si vous voulez étiqueter chaque ligne en fonction du fichier dont elle provient :

awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1

produit cette sortie :

1: line 1 from file1
2: line 1 from file2
1: line 2 from file1
2: line 2 from file2
...etc

Note : ce code suppose que le fichier1 est d'une longueur supérieure ou égale au fichier2.

Si le fichier1 contient plus de lignes que le fichier2 et que vous voulez produire des lignes vides pour le fichier2 après qu'il se termine, ajoutez une clause else au test getline :

awk '{print; if(getline < "file2") print; else print ""}' file1

o

awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1

5voto

Joshua Goldberg Points 1013

Réponse de @Sujoy pointe dans une direction utile. Vous pouvez ajouter des numéros de ligne, trier et dépouiller les numéros de ligne :

(cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-

Notez (ce qui m'intéresse) que cela nécessite un peu plus de travail pour obtenir un ordre correct si, au lieu de fichiers statiques, vous utilisez la sortie de commandes qui peuvent s'exécuter plus ou moins vite les unes que les autres. Dans ce cas, vous devez ajouter/sortir/supprimer une autre balise en plus des numéros de ligne :

(cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
   | sort -n  | cut -f2- | sort -n | cut -f2-

5voto

Cyrus Points 1567

Avec GNU sed :

sed 'R file2' file1

Sortie :

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

0voto

Dwedit Points 11

Voici un moyen graphique de le faire : Collez-les dans deux colonnes d'une feuille de calcul, copiez toutes les cellules, puis utilisez des expressions régulières pour remplacer les tabulations par des nouvelles lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X