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

#awk #formatting #tabular

#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("] %8.2f %8.2f %8.2f n" ,field1, field2, field3, filed4); '
  

Я действительно хотел бы воздержаться от форматирования echo в формате ascii, если смогу.

Ответ №1:

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

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

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

    (printf "PERM LINKS OWNER GROUP SIZE MONTH DAY HH:MM/YEAR NAMEn" 
   ; ls -l | sed 1d) | column -t
  

Комментарии:

1. Еще не знал об этом. Большое спасибо за этот отличный совет!

Ответ №2:

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

 awk 'BEGIN {printf("%s %8s %8s %8s n" ,"field1", "field2", "field3", "field4")}
{printf("%6.2f %8.2f %8.2f %8.2fn", $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 в каждой строке и ничего больше. Настройте ее в соответствии с вашими потребностями…

Комментарии:

1. Используя awk , как мы можем гарантировать, что ширина столбца будет соответствовать любой строке произвольной длины?

2. @FelipeAlvarez — опубликуйте новый вопрос. Но вы можете выполнить двойной проход данных. на первом этапе вы вычисляете максимальную ширину, на втором этапе вы печатаете данные, используя ширину с первого прохода. третий вариант — использовать достаточно большую ширину. 4-й — вместо этого сгенерировать csv-файл и использовать его вместо этого, например, в электронной таблице или с использованием python и csv-модуля и т.д. Кроме того, взгляните на column программу. Создайте столбец ^man`

3. @Fredrik Pihl Привет, я хотел свести в таблицу некоторую информацию, которая хранится в глобальных переменных. Как я могу использовать эти переменные в приведенной выше команде awk для печати в табличном формате.

4. @runner — ты имеешь в виду a="a b c d" ; awk '{print $1}' <<<$a ? Использование bash здесь-document . Если нет, пожалуйста, отправьте новый вопрос, поскольку этот довольно старый…