J'ai les deux fichiers suivants (j'ai rempli les lignes avec des points pour que chaque ligne d'un fichier ait la même largeur et ai mis file1 en majuscules pour le rendre plus clair).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Notez que file2 est plus long que file1.
Lorsque j'exécute cette commande:
paste file1 file2
Je reçois cette sortie
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Que puis-je faire pour que la sortie soit la suivante?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
j'ai essayé
paste file1 file2 | column -t
mais il fait ceci:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
pas aussi moche que la sortie d'origine mais de toute façon incorrecte en colonne.
text-processing
columns
paste
Tulains Córdova
la source
la source
paste
utilise des tabulations devant les lignes du deuxième fichier. Vous devrez peut-être utiliser un post-processeur pour aligner les colonnes de manière appropriée.paste file1 file2 | column -tn
?Réponses:
En supposant que vous n'ayez aucun caractère de tabulation dans vos fichiers,
l'argument étant
-t
choisi de manière appropriée pour couvrir la largeur de ligne maximale souhaitée dans le fichier 1.OP a ajouté une solution plus flexible:
Je l'ai fait pour que cela fonctionne sans le numéro magique 13:
Ce n'est pas facile à taper mais peut être utilisé dans un script.
la source
Je pensais que awk pourrait le faire bien, alors j'ai googlé "awk en lisant l'entrée de deux fichiers" et j'ai trouvé un article sur stackoverflow à utiliser comme point de départ.
Est d'abord la version condensée, puis entièrement commentée ci-dessous. Cela a pris plus de quelques minutes à travailler. Je serais ravi des améliorations apportées par des gens plus intelligents.
Et voici la version entièrement documentée de ce qui précède.
la source
Pas une très bonne solution mais j'ai pu le faire en utilisant
où TAB est remplacé par le caractère de tabulation.
la source
&&
la commande sed?&
met ce qui est recherché (un onglet dans ce cas). Cette commande remplace simplement l'onglet au début par deux onglets.TAB
pour\t
faire ce travail dans zsh sur Debian Ubuntu. Et cela ne fonctionne que si file1 a moins de 15 caractèresSur Debian et dérivés,
column
a une option-n
nomerge qui permet à la colonne de faire la bonne chose avec des champs vides. En interne,column
utilise lawcstok(wcs, delim, ptr)
fonction, qui fractionne une chaîne de caractères larges en jetons délimités par les caractères larges dans l'delim
argument.wcstok
commence en sautant de larges caractèresdelim
, avant de reconnaître le jeton. L'-n
option utilise un algorithme qui n'ignore pas les caractères larges initiaux dansdelim
.Malheureusement, ce n'est pas très portable:
-n
est spécifique à Debian, etcolumn
n'est pas en POSIX, c'est apparemment une chose BSD.la source
Supprimer les points que vous avez utilisés pour le rembourrage:
fichier1:
fichier2:
Essaye ça:
Et vous obtiendrez:
la source
paste
, échouera à imprimer la sortie appropriée s'il y a des lignes contenant des tabulations. +1 pour avoir été différent cependantUne
awk
solution qui devrait être assez portable et devrait fonctionner pour un nombre arbitraire de fichiers d'entrée:la source
paste-awk
etpaste file1 file2|paste-awk
j'ai essayé et j'ai essayéawk paste-awk file1 file2
mais aucun n'a fonctionné.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
devrait fonctionner, au moins pour GNU awk et mawk.paste
y a moins d'espace entre les deux rangées. Et si le fichier d'entrée n'a pas toutes les lignes de la même longueur, il en résultera une ligne alignée à droite-F\\t