Existe-t-il une commande ou un ensemble de commandes que je peux utiliser pour aligner horizontalement des lignes de texte sur un caractère arbitraire? Par exemple, avec une liste d'adresses e-mail, la sortie produira un fichier texte avec tous les caractères '@' alignés verticalement.
Pour réussir, je crois qu'un nombre variable d'espaces vides doit être ajouté au début de la plupart des lignes. Je ne veux pas de colonnes séparées car elles prennent plus d'effort à lire (par exemple, column -t -s "@" < file.txt
).
Avant:
[email protected]
[email protected]
[email protected]
Après:
[email protected]
[email protected]
[email protected]
Autrement dit: puis-je spécifier qu'un caractère soit un point d'ancrage autour duquel le texte environnant est centré horizontalement? Mon cas d'utilisation est celui des adresses e-mail, pour les rendre plus faciles à scanner visuellement.
la source
@
symboles?@
symboles ne devraient pas être un problème avec les adresses e-mail, mais un utilisateur devrait être en mesure de sélectionner l'instance d'un caractère par ligne qui sera l'`` ancre '' autour de laquelle l'autre texte sera centré.@
symboles sont autorisés dans les adresses e-mail, par exempletom"@brossmann"@example.com
. C'est pourquoi j'ai demandé ce qui devrait arriver s'il y a plusieurs@
symboles :).@
symboles ne sont pas autorisés dans une variété de services de messagerie. Il est tout à fait raisonnable de s'attendre à des e-mails "normaux" qui correspondent à un standard plus strict que le "vrai", à moins que vous n'ayez affaire à des entrées utilisateur brutes et non filtrées, auquel cas vous êtes plus susceptible de traiter des lignes sans réponse@
.Réponses:
NON Awk. Uniquement
sed
etcolumn
:Production:
Maintenant, à mon avis, c'est presque la même que la solution de Sundeep, elle semble juste plus courte / a moins d'appels vers
sed
, et elle suppose également que@
cela ne se produit qu'une seule fois sur chaque ligne.la source
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
Au plus simple, vous pouvez simplement imprimer le premier champ dans une largeur de champ suffisamment grande, par exemple
AFAIK toute méthode qui ne suppose pas une largeur de champ maximale spécifique nécessitera soit de conserver le fichier en mémoire, soit d'effectuer deux passes.
la source
cw=$(cut -d@ -f1 file | wc -L)
puisawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt
. Il a bien formaté le reste, mais certaines données sont manquantes.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
solution hacky, suppose beaucoup de choses sur le texte d'entrée
la source
Une solution Python rapide qui utilise la longueur de remplissage la plus courte possible qui aligne à droite toutes les chaînes à gauche du séparateur:
Usage:
la source
Une autre solution GNU
awk
+column
:Le résultat:
la source
Cela peut également fonctionner avec la manipulation de chaînes Bash.
Script bash (4.x):
Le résultat:
la source