如何在整齐的列中格式化bash命令的输出

时间:2011-06-24 03:07:32

标签: bash awk zsh

我有一个函数,它输出许多行,我想在列中格式化。问题是任何特定的“单元格”(如果我可能使用该术语)的数据的宽度是可变的,所以将它管道化为像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,还是我需要使用其他东西?

6 个答案:

答案 0 :(得分:75)

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

答案 1 :(得分:40)

通过搜索“linux output formatted columns”找到了这个。

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

根据您的需要,它就像:

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

答案 2 :(得分:3)

虽然可以使用awk printf,但您可能需要查看pr或(在BSDish系统上)rs进行格式化。

答案 3 :(得分:3)

由于AIX没有“column”命令,我在下面创建了简单的脚本。没有doc&amp; amp;会更短。输入编辑...:)

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

答案 4 :(得分:1)

尝试

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

甚至

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

如果输入不是很大。

答案 5 :(得分:1)

如果您的输出由制表符分隔,则快速解决方案是使用tabs命令调整制表符的大小。

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