Come posso formattare l’output di un comando bash in colonne pulite

Ho una funzione che emette molte righe di informazioni che voglio formattare in colonne. Il problema è che la larghezza di una particolare “cella” (se posso usare quel termine) di dati è variabile, quindi collegarla a qualcosa come awk non mi dà quello che voglio.

La funzione è “chiavi” (non che importi) e sto provando qualcosa del genere:

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

ma l’output (un frammento di esso, cioè) si presenta così:

 "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 

Come posso costringere le cose a rimanere in colonne ordinate? È ansible con awk o devo usare qualcos’altro?

    column(1) è tuo amico.

     $ 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 

    Trovato questo cercando “colonne formattate di output linux”.

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

    Per le tue esigenze, è come:

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

    Mentre è ansible utilizzare awf ‘s printf , si consiglia di esaminare in pr o (su sistemi BSDish) rs per la formattazione.

    Poiché AIX non ha un comando “column”, ho creato lo script semplicistico di seguito. Sarebbe ancora più breve senza le modifiche di 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"; 

    Provare

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

    o anche

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

    se l’input non è molto grande.

    Se il tuo output è delimitato da tabs, una soluzione rapida sarebbe utilizzare il comando tabs per regolare le dimensioni delle tue tabs.

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