J'ai trois fichiers contenant une séquence triée de nombres, un par ligne:
file1
1
2
3
file2
1
3
4
file3
1
5
Je souhaite "aligner" ces trois fichiers côte à côte comme suit:
file1 file2 file3
1 1 1
2
3 3
4
5
J'ai essayé avec sdiff
mais ça ne marche qu'avec 2 fichiers
text-processing
awk
diff
cheseaux
la source
la source
diff3
?diff3
n'a pas ce format de sortie.diff3
et comme @Kusalananda l'a correctement indiqué, il ne produit pas cette sortie. Aussi, je recherche une solution générique (pour n fichiers, n> 2)5
trouve- t -il à la cinquième ligne au lieu du troisième?Réponses:
Vous pouvez traiter chaque fichier et imprimer une ligne avec un caractère, par exemple
X
pour chaque numéro manquant dans la séquence 1- max (où max est le dernier numéro de ce fichier),paste
les résultats remplacent ensuite ce caractère par un espace:Si une certaine valeur manque dans tous les fichiers, vous obtiendrez des lignes vides dans votre sortie (en fait, elles ne sont pas vides, elles ne contiennent que des blancs).
Pour les supprimer, remplacez
tr X ' '
parsed '/[[:digit:]]/!d;s/X/ /g'
Également, si vous avez besoin d'un en-tête, vous pouvez toujours exécuter quelque chose comme ceci en premier:la source
;1
Cependant, j'ai eu du mal à comprendre ce que la partie à la fin signifiait. J'utilise à la{print $0}
place, un peu moins crypté à mon humble avis. Quoi qu'il en soit, merci encoreUne solution générale avec awk: nécessite GNU awk
A adopté une approche différente et plus simple à ce sujet sur la base du commentaire de Don:
la source
Une solution avec
bash
,join
,paste
et mauvais goût:À l'exception du dernier
sort -n
, tout cela fonctionne avec des éléments de texte plutôt qu'avec des nombres, tant que les éléments ne contiennent pas d'onglets (maisTAB
peuvent être modifiés en n'importe quel autre séparateur). En outre, cela pourrait être fait avec seulement 3 fichiers temporaires et quelques modifications (mais cela ne ferait qu'augmenter le mauvais goût).la source