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?
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
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}'
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";
Bien que awk
de printf
puisse être utilisé, vous souhaiterez peut-être consulter pr
ou (sur les systèmes BSDish) rs
pour le formatage.
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.
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 }'