web-dev-qa-db-ja.com

きれいな列でbashコマンドの出力をフォーマットするにはどうすればよいですか

列にフォーマットする情報の多くの行を出力する関数があります。問題は、データの特定の「セル」(その用語を使用する場合)の幅が可変であるため、awkのようなものにパイピングしても必要なものが得られないことです。

この関数は「キー」であり(重要ではありません)、次のようなことを試みています。

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

しかし、出力(そのスニペット)は次のようになります。

"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

どうすれば物事をきちんとした柱に留めることができますか?これはawkで可能ですか、それとも他のものを使用する必要がありますか?

50
iconoclast

column(1) はあなたの友達です。

$ 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

これは、「Linux出力のフォーマットされた列」を検索することで発見されました。

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

あなたのニーズについては、次のようなものです。

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

AIXには「列」コマンドがないため、以下の単純なスクリプトを作成しました。ドキュメントと入力編集なしではさらに短くなります... :)

#!/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

awkprintfを使用できますが、フォーマットのためにprまたは(BSDishシステムでは)rsを調べることができます。

3
geekosaur

試して

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

あるいは

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

入力があまり大きくない場合。

1

出力がタブで区切られている場合、簡単な解決策は、tabsコマンドを使用してタブのサイズを調整することです。

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