12
votes

Comment générer le contenu d'un tableau dans les colonnes de bash

Je voulais afficher une longue liste de chaînes d'un tableau.

En ce moment, mon script traversait une boucle pour faire écho à chaque valeur à la sortie standard: p>

$ values=( 01----7 02----7 03-----8 04----7 05-----8 06-----8 07-----8 08-----8 09---6 10----7 11----7 12----7 13----7 14-----8 15-----8 16----7 17----7 18---6 19-----8 20-----8 21-----8)


6 commentaires

colonne semble avoir des difficultés avec les faits que votre entrée a une colonne et que certaines lignes sont plus étroites qu'un arrêt de tabulation. écho "$ {valeurs [@] /% / $ '\ n'}" | colonne semble fonctionner


@JohnsyWeb: Je devais ajouter un autre espace avant \ n pour le faire fonctionner avec cet ensemble de données. Mais cuitriment, la sortie est sur 3 colonnes seulement. Bien qu'il y ait beaucoup de salles pour 5 colonnes.


@Abo: So.com a avalé mon double espace avant le \ n ! écho "$ {valeurs [@] /% / $ '\ n'}" | Column -C 120 fournit cinq colonnes pour moi.


Encore une fois, si divisez de moitié mes espaces avant la nouvelle ligne!


@JohnsyWeb: En fait, je n'ai donc pas avalé vos espaces. Il s'agit d'une fonctionnalité HTML, plusieurs espaces blancs sont rendus comme une par défaut. Regardez la source, ils sont.


@Arko. Bien sûr, vous avez raison. J'espérais que les backtsks pouvaient aider à les préserver. Vis et apprend!


7 Réponses :


0
votes

Tabespaces

Utilisez un onglet après chaque valeur. p>

(il coule automatiquement à la ligne suivante ...) p>

for value in ${values[@]}
do
  echo -en "$value\t"
done


1 commentaires

Je suis sûr que vous voulez dire echo -en "$ valeur \ t"



23
votes

Vous pouvez tuyer votre sortie à colonne .

colonne semble avoir du mal à une autre entrée dans une seule colonne étant plus étroite qu'un Tabstop (8 caractères).

en utilisant printf dans un pour -LOOP aux valeurs de pad à 8 caractères semble faire le truc: xxx


3 commentaires

+1 correct! Colonne Pour la sortie Wise de colonne et Column -x pour la sortie Wise de ligne.


et @dennis: Nice! C'est exactement ce que je cherchais. Mais le résultat n'est pas parfait: en fonction de la longueur des cordes, il y a parfois des trous dans les colonnes. Il se sent comme il s'enclenche la taille des colonnes à une largeur (comme les onglets insérés entre les valeurs) mais ne prend pas soin de la plus grande valeur de valeur pour calculer la largeur globale de la colonne. La commande ls prend en charge ceci pour une sortie propre.


printf "% -8s \ n" "$ {valeur [@]}" | colonne fonctionne aussi.



4
votes

Voici quelques techniques pouvant être utilisées avec johnsyweb's réponse afin que vous puissiez faire votre sortie sans boucle: xxx

ou < Pré> xxx

ou xxx


5 commentaires

Agréable! Essayé les trois techniques, à peu près le même résultat. Voir mon commentaire sur la réponse de @ johnysweb.


@Arko: sans voir vos données, il est impossible de faire des suggestions supplémentaires. colonnes utilise des onglets et ajuste également le nombre de colonnes en fonction de la longueur de la chaîne la plus longue.


Mes données sont un tableau simple de chaînes, comme `valeurs = (un deux trois quatre cinq) '. J'ai dû manquer quelque chose. Aucun moyen d'obtenir une colonne correctement formatée. Mettra à jour la question avec plus d'informations à ce sujet.


@Abo: vos lignes de données sont parfaitement utiles à l'aide de la commande que vous avez fournie. Je n'ai pas pu reproduire exactement ce que votre capture d'écran montre, mais je me suis terminé en rétrécissant la fenêtre de mon terminal à 60 caractères de large et en émettant une commande onglets -10 avant d'émettre votre echo ... colonne commande.


Je m'attendais à votre réponse. Le problème est spécifique à mon ordinateur. Je vais essayer de suivre pourquoi. En attendant, j'ai trouvé une autre "façon" de le faire ... voir ma propre réponse. ;)



1
votes

Il peut sembler trop cher, mais je suis proposé ma propre solution. J'ai écrit un petit script qui fait exactement ce que je voulais: prenez une liste de valeurs et de les produire dans une vue colonne assez formatée.

http://github.com/arko/columnize


2 commentaires

Suggestions: Comparaison entière: si (($ {# valeur}> $ longest_value)) et d'autres personnes, vous utilisez (()) ailleurs - vous pouvez aussi: < Code> ((colonnes = term_width / (longest_value + 2))) et ((((spaces_missing = longest_value - value_len + 2)) , au lieu d'écarts d'écho dans un pour < / code> boucle: printf "% * s" $ spaces_missing


@Dennis Williamson: changements commis! Je savais que pour boucle était gênant ... merci pour les suggestions! :-)



2
votes

Je sais que c'est un vieux fil, mais je reçois des résultats erratiques de la colonne, alors je pensais donner ma solution. Je voulais regrouper toutes les 3 lignes en 3 colonnes espacées uniformément.

cat file.txt | xargs printf '%-24s\n' | sed '$p;N;s/\n//;$p;N;s/\n//'


2 commentaires

Ceci est un scénario différent de la question. Vous devriez probablement le poster comme une autre question.


C'est une bonne réponse à la question que j'avais eue. Je devais sortir des colonnes sans utiliser de colonne.



1
votes

Je sais que c'est un vieux fil mais j'ai couru dans cette même situation. J'ai fini par combiner quelques idées d'ici.

pour la solution basée sur l'utilitaire de colonne (sans problème d'espace initial): xxx

Utilisation de @ Arko's Script de base, cela peut gérer les valeurs avec des espaces. Remarquez la spécification Printf de% - * S pour la gauche, les colonnes et le droit abandonneraient le '-'. Je n'ai pas inclus mon supposition de terminal mais c'est réglable (Terminez-widdth). xxx

}


0 commentaires

1
votes

pour une raison quelconque colonne ne fonctionne pas pour moi. Dans mon cas, j'ai un tableau comme xxx

à la place, j'ai utilisé xxx


1 commentaires

Essayez: ifs = $ '\ n' echo "$ {tableau [@]}" | colonne