J'édite un simple tableau. J'aimerais bien le mettre en forme. Bien que je pourrais utiliser tbl
, latex
ou similaire, cela semble exagéré - le texte brut est vraiment suffisant. Comme c'est simple, je pourrais aussi bien avoir la source comme sortie. Donc, la source devrait aussi bien paraître. Cela semble être un travail parfait pour column -s '|' -t
- il trouve les séparateurs et insère automatiquement les espaces à aligner en fonction de la largeur maximale dans chaque colonne. Malheureusement, il supprime les séparateurs, donc je ne peux pas le relancer après une édition supplémentaire. Existe-t-il un bon outil de traitement de texte qui puisse le faire de manière idempotente, afin que sa sortie serve d'entrée? Ou dois-je écrire le mien?
EDIT: voici un exemple de ce que je veux:
foo | bar | baz
abc def | 12 | 23456
devraient devenir
foo | bar | baz
abc def | 12 | 3456
Quand ' '
est à la fois le séparateur et l'entretoise, column -t
fonctionne bien. Mais mes objets contiennent des espaces, donc je ne peux pas l'utiliser. Le fait que les entretoises soient distinctes des séparateurs complique les choses. Je pense qu'il est utile de les traiter comme des caractères de séparation à côté des séparateurs, mais ce n'est pas le column -s '|' -t
cas (bien que le comportement actuel soit également utile).
la source
printf
holocauste à chaque fois, que j'ai trouvée jusqu'à présent, consiste à ajouter un caractère unique (comme@
) dans les données, et à l'utiliser... | column -s@ -t
ensuite.Réponses:
Je ne sais pas si je comprends bien quel est votre problème. Mais, peut-il être résolu en ajoutant un séparateur temporel supplémentaire? vous pouvez donc utiliser le deuxième séparateur pour marquer les séparations, en conservant le séparateur d'origine intact.
Voir cet exemple où j'ajoute un "@" à chacun des "|" donc l'entrée de la commande de colonne serait "xxx @ | yyyy". La colonne traitera le "@" en gardant le "|" intacte:
la source
sed 's/ *| */@| /g'
placesed 's/ |/|/g'
après lescolumn
correctifs les espaces supplémentaires ajoutés. Nous avons maintenant une solution qui fonctionne assez bien pour moi. (Bien que ce serait bien si cela ne dépendait pas d'un personnage supplémentaire comme celui-ci. Et si un n'était pas disponible?)Ce n'était pas disponible lorsque vous avez posé la question mais à partir de la version 2.23
column
deutil-linux
vous permet de sélectionner le séparateur de sortie viaAlors lancez simplement:
la source
util-linux
version n'est pas disponible sur Ubuntu 18.04 (et probablement d'autres distributions dérivées de Debain) au moment de la rédaction. Seule labsdmainutils
version est disponible. lebsdmainutils
version ne prend pas en charge le formatage de sortie.Voici un script bash. Il n'utilise pas 'column -t`, et le séparateur est géré exactement comme l'IFS, car c'est l'IFS (ou au moins, la version interne d'awk de l'IFS) ... Le délimiteur par défaut est $' \ t '
Ce script remplit complètement le champ le plus à droite.
'colonne' ne fait pas cela.
En remplissant toutes les colonnes, ce script peut être
facilement modifié pour créer également un cadre de tableau.
Remarque. Le fichier d'entrée doit être traité deux fois
(«colonne» devrait également le faire)
La première passe consiste à obtenir les largeurs maximales des colonnes.
La deuxième étape consiste à développer les champs (par colonne)
Ajout de quelques options et correction d'un bug flagrant (renommer les variables :(
la source
Jetez un oeil au plugin vim appelé Tabularize
la source
Il s'agit d'un ajustement en deux passes sur la réponse de hmontoliu , qui évite d'avoir à coder en dur le délimiteur, en le devinant à partir des données d'entrée.
$d
.@
, comme le commentaire de PeterO .Le code est une fonction qui accepte un nom de fichier, ou bien une entrée de STDIN :
Sortie de
algn foo
(ou aussialgn < foo
):la source
Idée utilisée de hmontoliu pour implémenter une commande simple:
Commentaire:
${1:-,}
- est un premier argument avec,
par défautsed
insère un symbole intermédiaire ($interm
2ème argument ou~
par défaut)column
remplace ensuite le symbole intermédiaire par des espaces qui font l'alignementsed
nettoie les espaces redondants aprèscolumn
commandeExemple d'utilisation:
Il est également bon dans la mesure où il est idempotent: vous pouvez l'appliquer plusieurs fois et obtenir le même résultat (par exemple lorsque vous éditez dans vim et réalignez).
la source