列にフォーマットする情報の多くの行を出力する関数があります。問題は、データの特定の「セル」(その用語を使用する場合)の幅が可変であるため、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で可能ですか、それとも他のものを使用する必要がありますか?
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}'
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";
awk
のprintf
を使用できますが、フォーマットのためにpr
または(BSDishシステムでは)rs
を調べることができます。
試して
xargs -n2 printf "%-20s%s\n"
あるいは
xargs printf "%-20s%s\n"
入力があまり大きくない場合。
出力がタブで区切られている場合、簡単な解決策は、tabs
コマンドを使用してタブのサイズを調整することです。
tabs 20
keys | awk '{ print $1"\t\t" $2 }'