J'ai un script qui imprime des colonnes, mais si la colonne de gauche est vide, elle ne s'alignera pas correctement.
En ce moment, j'itère sur un tableau et j'imprime la clé / valeur et j'utilise le colonne
pour formater les colonnes. Voici à quoi ressemble le code.
column1 column2 prometheus-k8s-0 carlosedp/prometheus:v2.7.1 carlosedp/prometheus-config-reloader:v0.28.0 carlosedp/configmap-reload:v0.2.2
Et voici un exemple de ce à quoi ressemble la sortie actuelle.
column1 column2 prometheus-k8s-0 carlosedp/prometheus:v2.7.1 carlosedp/prometheus-config-reloader:v0.28.0 carlosedp/configmap-reload:v0.2.2
Existe-t-il un moyen simple d'aligner le texte à droite si la première colonne est vide?
Mise à jour:
J'ai trouvé l'un des problèmes et mis à jour le code pour montrer comment je crée le tableau. La commande que j'utilisais pour créer le premier tableau ajoutait un caractère de nouvelle ligne.
Après la mise à jour pour supprimer le caractère de nouvelle ligne, la sortie ressemble maintenant à ceci, donc il n'y a pas de cas où il y a une clé vide, il y a juste des cas où il y a plusieurs valeurs pour une clé donnée.
# Code to make the array declare -A pods declare -A associative_array pods=$(kubectl get pods | awk '{if(NR>1)print $1}') for p in ${pods[*]}; do image=$(kubectl get pod "$p" -o json | jq -r '.spec.containers[].image') associative_array[$p]+="$image" done # Code to print the array (printf "column1\tcolumn2\n" for i in "${!associative_array[@]}"; do printf '%s\t%s\n' "$i" "${associative_array[$i]}" done) | column -t -x ...
3 Réponses :
Il semble que vous ayez juste besoin d'ajouter un spécificateur de longueur au premier % s
de votre appel printf
:
column -txns $'\t'
Remarque que cela supprime le caractère de tabulation, qui n'est plus nécessaire puisque la première colonne est maintenant remplie à droite avec des espaces jusqu'à ce qu'elle mesure 50 caractères. Aussi, j'ai choisi 50
parce que c'est la largeur de la colonne 1 dans vos deux premières lignes.
Si vous utilisez cette approche, vous voudrez également supprimer le | colonne -t -x
à la fin, car elle est désormais redondante et annulera en fait votre mise en forme printf
car elle traite les délimiteurs consécutifs comme un seul délimiteur.
Si votre version de la colonne
le prend en charge, vous pouvez également essayer de laisser votre printf
tel quel et utiliser à la place la colonne -t -x -s $ '\ t' -n
, qui indique à la colonne
d'utiliser \ t
comme délimiteur, et de ne pas traiter plusieurs délimiteurs adjacents comme un seul délimiteur:
column -t -x -s $'\n' -n
Et bien sûr, vous pouvez regrouper certaines options et raccourcir
$ printf "%s\t%s\n" column1 column2 foo bar "" baz | column -t -x -s $'\t' -n column1 column2 foo bar baz
à
$ printf "%-50s%s\n" "$i" "${associative_array[$i]}"
p >
C'est ce à quoi je pensais aussi, mais il produit toujours le même résultat: /
@jmreicha C'est parce que vous le redirigez vers la colonne
, ce qui annule le formatage.
@jmreicha J'ai modifié ma réponse pour inclure une deuxième solution qui utilise toujours la colonne
.
Hrm, quelque chose de funky doit se passer, après la mise à jour du script pour utiliser les arguments supplémentaires de la colonne
, il semble que je reçoive toujours le même résultat.
@jmreicha Si vous exécutez la commande printf
à partir de ma réponse directement sur la ligne de commande, obtenez-vous le même résultat que celui indiqué dans ma réponse? (c'est-à-dire la commande qui affiche foo, bar et baz)
Oui, je suis capable d'imprimer correctement votre exemple. Je n'arrive tout simplement pas à mettre mon exemple en forme correctement, donc je pense qu'il me manque peut-être quelque chose. J'ai ajouté un peu plus de débogage au message d'origine, faites-moi savoir s'il y a d'autres informations que vous pensez utiles.
Vous voudrez peut-être examiner la réponse de @ ctac_. Il a repéré quelque chose que j'ai raté. Il ne devrait y avoir aucun moyen d'obtenir une chaîne vide lors de l'itération des clés d'un tableau associatif. Il semble que vous ayez une valeur qui contient des retours à la ligne.
Vous ne travaillez certainement pas avec un tableau associatif.
Vous ne pouvez pas attribuer de clé vide.
Essayez et voyez ce qui se passe!
declare -A associative_array=( [one]=bar []=truc [three]=foo [four]=baz) (printf "column1\tcolumn2\n" for i in "${!associative_array[@]}"; do printf '%s\t%s\n' "$i" "${associative_array[$i]}" done) echo "number of items = ${#associative_array[@]}" ./script-bash.sh: line 1: []=truc: bad array subscript column1 column2 four baz three foo one bar number of items = 3
Je vois. Je me demande s'il existe un moyen de gérer le cas alors pour les clés vides?
@jmreicha Si vous avez besoin de pouvoir avoir des clés vides, ajoutez simplement une chaîne fixe à chaque clé lorsque vous remplissez le tableau, puis supprimez-la à nouveau lorsque vous l'imprimez. Quelque chose comme array ["x $ key"] = "$ value"
pour l'affectation, puis lorsque vous itérez le tableau et que vous souhaitez imprimer la clé, vous pouvez remplacer "$ i "
avec " $ {i # x} "
, ce qui supprimera le 'x'
du début. Mais si vous vous attendez à avoir des clés vides, vous voudrez peut-être vous demander si un tableau associatif est vraiment la bonne façon d'implémenter votre programme. Surtout si vous pouvez obtenir plusieurs clés vides.
@jmreicha Si vous avez plusieurs clés vides (ou d'ailleurs, des clés en double), chaque paire clé / valeur suivante où la clé est vide (ou est un double d'une autre clé) signifiera que vous écrasez la valeur précédente, car chaque clé doit être unique, et un tableau associatif ne stockera qu'une seule valeur pour chaque clé unique.
Merci, je pense que je vois une partie du problème maintenant. La raison pour laquelle j'obtenais une sortie différente est que la commande que j'utilisais pour créer le tableau ajoutait un caractère de nouvelle ligne supplémentaire. Travailler sur la mise à jour du message original avec de nouvelles informations.
Article original mis à jour avec (espérons-le) de meilleurs détails, c'est un peu plus compliqué que je ne le pensais bien que je ne pense pas qu'il y ait réellement un cas où il y a des clés vides. Peut-être que la meilleure question pour cela pourrait être: "Comment dois-je aborder ce problème sans tableaux associés"?
Ce n'est pas une solution parfaite mais j'ai pu obtenir à peu près le comportement que je souhaitais en vérifiant si la deuxième colonne avait plus d'un mot, puis en la divisant et en répétant chaque chaîne si c'est le cas.
prometheus-k8s-0 carlosedp/prometheus:v2.7.1 prometheus-k8s-0 carlosedp/prometheus-config-reloader:v0.28.0 prometheus-k8s-0 carlosedp/configmap-reload:v0.2.2
Votre montage ne montre rien! Dites-nous comment vous avez obtenu votre tableau.