Fusionner des lignes alternatives à partir de deux files

Fichier1:

.tid.setnr := 1123 .tid.setnr := 3345 .tid.setnr := 5431 .tid.setnr := 89323 

Fichier2:

 .tid.info := 12 .tid.info := 3 .tid.info := 44 .tid.info := 60 

Fichier de sortie:

 .tid.info := 12 .tid.setnr := 1123 .tid.info := 3 .tid.setnr := 3345 .tid.info := 44 .tid.setnr := 5431 .tid.info := 60 .tid.setnr := 89323 

Utilisation de la paste :

 paste -d \\n file2 file1 

Une autre solution awk:

 awk '{print; getline < "file1"; print}' file2 

Utilisation de awk ( gawk , nawk , mawk ):

 awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile 
  • NR==FNR {x[FNR]=$0;next} est égalisé uniquement si le numéro d'logging actuel est égal au numéro d'logging actuel du file (donc il est apparié uniquement lors du traitement du premier file): stocke le numéro d'logging actuel traitement de l'logging dans le tableau x à un index égal au numéro d'logging du file en cours et ignore l'logging en cours
  • {print x[FNR]"\n"$0} : imprime le contenu du tableau x à un index égal au numéro d'logging actuel du file suivi d'une nouvelle ligne et du contenu de l'logging en cours
 ~/tmp$ cat file1 .tid.setnr := 1123 .tid.setnr := 3345 .tid.setnr := 5431 .tid.setnr := 89323 ~/tmp$ cat file2 .tid.info := 12 .tid.info := 3 .tid.info := 44 .tid.info := 60 ~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 .tid.info := 12 .tid.setnr := 1123 .tid.info := 3 .tid.setnr := 3345 .tid.info := 44 .tid.setnr := 5431 .tid.info := 60 .tid.setnr := 89323 

La solution de paste est la plus portable et la plus efficace. Je ne mentionne cette alternative que si vous préférez son comportement dans le cas où les deux files n'ont pas le même nombre de lignes:

Avec GNU sed :

 sed Rfile1 file2 

Si file1 a less de lignes que file2 , sed n'affiche rien quand il est épuisé (par opposition aux lignes vides pour paste ).

Si file1 a plus de lignes que file2 , ces lignes supplémentaires seront supprimées (par opposition à l'printing de lignes vides pour le file2 avec paste ).

 $ paste ab 1 a 2 b 3 4 $ paste -d \\nab 1 a 2 b 3 4 $ sed Rb a 1 a 2 b 3 4 $ sed Ra b a 1 b 2 

La solution la plus simple est donnée ci-dessous.

 cat file1 >> file2 

ou

 cat file2 >> file1