Comment deux fichiers texte non triés de différentes longueurs peuvent-ils être affichés côte à côte (en colonnes) dans unshell
Donné one.txt
et two.txt
:
$ cat one.txt
apple
pear
longer line than the last two
last line
$ cat two.txt
The quick brown fox..
foo
bar
linux
skipped a line
Afficher:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
paste one.txt two.txt
fait presque l'affaire mais n'aligne pas bien les colonnes car il imprime juste un onglet entre les colonnes 1 et 2. Je sais comment faire avec emacs et vim mais je veux que la sortie soit affichée sur stdout pour la tuyauterie ect.
La solution que j'ai proposée utilise sdiff
, puis des tuyaux à sed pour supprimer la sortie sdiff
ajoute.
sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'
Je pourrais créer une fonction et la coller dans mon .bashrc
mais sûrement une commande pour cela existe déjà (ou une solution plus propre potentiellement)?
linux
shell
unix
command-line
gnu-coreutils
Chris Seymour
la source
la source
Réponses:
Vous pouvez utiliser
pr
pour ce faire, en utilisant le-m
drapeau pour fusionner les fichiers, un par colonne, et-t
pour omettre les en-têtes, par exemple.les sorties:
Voir également:
la source
pr
auparavant. J'ai essayé avec 3 fichiers et la sortie a été tronquée mais l'-w
option a résolu cela. Bonne réponse.$COLUMNS
, qui devrait être fourni par le shell.pr
coupe la fin des longues lignes. Y a-t-il un moyen de le faire envelopper les lignes?Pour développer un peu la réponse de @Hasturkun : par défaut
pr
n'utilise que 72 colonnes pour sa sortie, mais il est relativement facile de lui faire utiliser toutes les colonnes disponibles de votre fenêtre de terminal:La plupart des shell stockeront (et mettront à jour) la largeur d'écran de votre terminal dans la
$COLUMNS
variable d'environnement, nous transmettons donc simplement cette valeur àpr
pour l'utiliser pour le paramètre de largeur de sortie.Cela répond également à la question de @Matt :
Donc non:
pr
lui - même ne peut pas détecter la largeur de l'écran, mais nous aidons un peu en passant la largeur du terminal via l'-w
option.la source
Si vous savez que les fichiers d'entrée n'ont pas d'onglets, utiliser
expand
simplifie la réponse de @oyss :S'il peut y avoir des onglets dans les fichiers d'entrée, vous pouvez toujours développer en premier:
la source
L'utilisation
*
dans une spécification de format vous permet de fournir la longueur du champ de manière dynamique.la source
diff -y one.txt two.txt
un meilleur travail quepaste one.txt two.txt
et supprimer les caractères supplémentaires diffs qui sont affichés avecsed
est trivial en comparaison avec l'écriture / la mémorisation d'unawk
script. Même avec les deux fonctions en.bash_rc
plus! = Meilleur, plus lisible, plus rapide .. quel est l'avantage ici?supprimer dynamiquement le comptage de longueur de champ de la réponse de Barmar en fera une commande beaucoup plus courte .... mais vous avez toujours besoin d'au moins un script pour terminer le travail qui ne peut être évité quelle que soit la méthode que vous choisissez.
la source
Si vous souhaitez connaître la différence réelle entre deux fichiers côte à côte, utilisez
diff -y
:Vous pouvez également définir une largeur de sortie à l'aide de l'
-W, --width=NUM
option:et pour que
diff
la sortie de la colonne corresponde à votre fenêtre de terminal actuelle:la source
Il existe un
sed
moyen:Sous frapper, vous pouvez utiliser
printf -v
:(Bien sûr, la solution de @Hasturkun
pr
est la plus précise !) :Avantage de
sed
pluspr
Vous pouvez choisir finement la largeur de séparation et / ou les séparateurs:
Ou, à titre d'exemple, pour marquer des lignes contenant
line
:rendra:
la source
Retrouvez ci-dessous une solution basée sur python.
Exemple
la source
la source
sdiff
estdiff -y
que je discute dans la question.diff
ajoute des caractères entre les deux fichiers.