Красивая таблица печати с awk

Я хочу распечатать таблицу, которая выглядит так:

> field1 field2 field3 field4    
> 11.79     7.87    11.79    68   
> .. more numbers

Как я могу сделать так, чтобы заголовки для столбцов располагались таким образом, чтобы они располагались поверх соответствующего столбца?

> field1    field2  field3   field4       
> 11.79     7.87    11.79    68
> .. more numbers

Мой генерирующий скрипт выглядит так: Capture.sh:

  echo 'field1, field2, field3, field4'
  awk '/Capture the tablestuff/{set variables}
  /DONE/ { printf("%5d %8.2f %8.2f %8.2f \n" ,field1, field2, field3, filed4); '

Я действительно хотел бы воздержаться от ASCII-форматирования команды echo, если это возможно.


person tarrasch    schedule 07.06.2011    source источник


Ответы (2)


Как насчет этого однострочника:

awk 'BEGIN {printf("%s %8s %8s %8s \n" ,"field1", "field2", "field3", "field4")}
{printf("%6.2f %8.2f %8.2f %8.2f\n", $1, $2, $3, $4)}' input

field1   field2   field3   field4 
 11.79     7.87    11.79    68.00
 11.79     7.87    11.79    68.00
 11.79     7.87    11.79    68.00
 11.79     7.87    11.79    68.00

т.е. используя BEGIN для печати заголовка, а затем печатайте каждую строку, отформатированную в соответствии с printf, со всеми числами в файле input, здесь предполагается 4 в каждой строке и ничего больше. Настройте его под свои нужды...

person Fredrik Pihl    schedule 07.06.2011
comment
Используя awk, как мы можем гарантировать, что ширина столбца будет соответствовать любой строке произвольной длины? - person Felipe Alvarez; 19.11.2014
comment
@FelipeAlvarez - опубликуйте новый вопрос. Но вы можете сделать двойной проход данных. 1-й проход вы вычисляете максимальную ширину, 2-й проход вы печатаете данные, используя ширину из первого прохода. 3-й вариант - использовать достаточно большую ширину. 4-й - вместо этого сгенерировать CSV-файл и использовать его вместо этого, например. электронную таблицу или с использованием python и csv-модуля и т. д. Также взгляните на программу column. Сделайте ^man столбец` - person Fredrik Pihl; 19.11.2014
comment
@Fredrik Pihl Привет, я хотел свести в таблицу некоторую информацию, которая хранится в глобальных переменных. Как я могу использовать эти переменные в приведенной выше команде awk для печати в табличном формате. - person runner; 18.04.2016
comment
@runner -- ты имеешь в виду a="a b c d" ; awk '{print $1}' <<<$a? Использование bash здесь-документ. Если нет, пожалуйста, напишите новый вопрос, так как этот вопрос довольно старый... - person Fredrik Pihl; 18.04.2016

Как я могу сделать так, чтобы подписи для столбцов располагались таким образом, чтобы они располагались поверх соответствующего столбца?

Используйте 1_.

Пример со страницы man:

   (printf "PERM LINKS OWNER GROUP SIZE MONTH DAY HH:MM/YEAR NAME\n" \
   ; ls -l | sed 1d) | column -t
person Prince John Wesley    schedule 07.06.2011
comment
Еще не знал об этом. Большое спасибо за эту замечательную подсказку! - person Daniel Bubenheim; 09.10.2017