78 votes

Comment formater la sortie d'une commande bash en colonnes ordonnées

J'ai une fonction qui affiche le nombre de lignes de l'information que je veux format en colonnes. Le problème est que la largeur d'une "cellule" (si je puis employer ce terme) de données est variable, de sorte que la tuyauterie à quelque chose comme awk ne me donne pas ce que je veux.

La fonction "touches" (non pas que cela importe) et je suis en train d'essayer quelque chose comme ceci:

$ keys | awk '{ print $1"\t\t" $2 }'

mais la sortie (un extrait de c'est) ressemble à ceci:

"option-y"      yank-pop
"option-z"      execute-last-named-cmd
"option-|"      vi-goto-column
"option-~"      _bash_complete-word
"option-control-?"      backward-kill-word
"control-_"     undo
"control-?"     backward-delete-char

Comment puis-je forcer les choses pour rester en ordonnée les colonnes? Est-ce possible avec awk, ou dois-je utiliser autre chose?

103voto

column(1) est votre ami.

 $ column -t <<< '"option-y"      yank-pop
> "option-z"      execute-last-named-cmd
> "option-|"      vi-goto-column
> "option-~"      _bash_complete-word
> "option-control-?"      backward-kill-word
> "control-_"     undo
> "control-?"     backward-delete-char
> '
"option-y"          yank-pop
"option-z"          execute-last-named-cmd
"option-|"          vi-goto-column
"option-~"          _bash_complete-word
"option-control-?"  backward-kill-word
"control-_"         undo
"control-?"         backward-delete-char
 

53voto

Koterpillar Points 2657

Vous avez trouvé cela en recherchant "colonnes de sortie linux formatées".

http://www.unix.com/shell-programming-scripting/117543-formatting-output-columns.html

Pour vos besoins, c'est comme:

 awk '{ printf "%-20s %-40s\n", $1, $2}'
 

4voto

geekosaur Points 26170

Bien que awk 's printf puissent être utilisés, vous souhaiterez peut-être examiner pr ou (sur les systèmes BSDish) rs pour le formatage.

3voto

user2961066 Points 11

AIX n'ayant pas de commande "column", j'ai créé le script simpliste ci-dessous. Ce serait encore plus court sans les éditions de doc & input ... :)

 #!/usr/bin/perl
#       column.pl: convert STDIN to multiple columns on STDOUT
#       Usage: column.pl column-width number-of-columns  file...
#
$width = shift;
($width ne '') or die "must give column-width and number-of-columns\n";
$columns = shift;
($columns ne '') or die "must give number-of-columns\n";
($x = $width) =~ s/[^0-9]//g;
($x eq $width) or die "invalid column-width: $width\n";
($x = $columns) =~ s/[^0-9]//g;
($x eq $columns) or die "invalid number-of-columns: $columns\n";

$w = $width * -1; $c = $columns;
while (<>) {
        chomp;
        if ( $c-- > 1 ) {
                printf "%${w}s", $_;
                next;
        }
        $c = $columns;
        printf "%${w}s\n", $_;
}
print "\n";
 

3voto

Vytenis Points 359

Essayer

 xargs -n2  printf "%-20s%s\n"
 

ou même

 xargs printf "%-20s%s\n"
 

si l'entrée n'est pas très grande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X