web-dev-qa-db-fra.com

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

J'ai une fonction qui génère plusieurs lignes d'informations que je souhaite formater en colonnes. Le problème est que la largeur d'une "cellule" particulière (si je peux utiliser ce terme) de données est variable, donc le fait de le diriger vers quelque chose comme awk ne me donne pas ce que je veux.

La fonction est "clés" (pas que ça compte) et j'essaye quelque chose comme ça:

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

mais le résultat (un extrait de celui-ci) 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 à rester dans des colonnes ordonnées? Est-ce possible avec awk ou dois-je utiliser autre chose?

50
iconoclast

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
76

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}'
40
Koterpillar

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";
3
user2961066

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

3
geekosaur

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.

1
Vytenis Bivainis

Si votre sortie est délimitée par des tabulations, une solution rapide consisterait à utiliser la commande tabs pour ajuster la taille de vos tabulations.

tabs 20
keys | awk '{ print $1"\t\t" $2 }'
1
Lewis R