Как я могу отформатировать вывод команды 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, или мне нужно использовать что-то еще?
Ответы
Ответ 1
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
Ответ 2
Обнаружено это путем поиска "строк с форматированием вывода linux".
http://www.unix.com/shell-programming-scripting/117543-formatting-output-columns.html
Для ваших нужд это нравится:
awk '{ printf "%-20s %-40s\n", $1, $2}'
Ответ 3
В то время как awk
printf
может использоваться, вы можете захотеть просмотреть pr
или (в системах BSDish) rs
для форматирования.
Ответ 4
Так как AIX не имеет команды "column", я создал упрощенную script ниже. Это было бы даже короче без редактирования документа и ввода...:)
#!/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";
Ответ 5
Try
xargs -n2 printf "%-20s%s\n"
или даже
xargs printf "%-20s%s\n"
если вход не очень большой.
Ответ 6
Если ваш вывод разделен на вкладки, быстрым решением было бы использовать команду tabs
для настройки размера ваших вкладок.
tabs 20
keys | awk '{ print $1"\t\t" $2 }'