Проблема формата печати AWK - PullRequest
0 голосов
/ 23 мая 2011

У меня есть файл с данными

number  name               age sex
102234  James_Mckenzie      21  M
102233  Jim_Reil            24  M
102235  Alan_Lightbrighter  19  M

...

, и я пытаюсь распечатать их в такой форме

number : 
name   :                  age :
sex    : 

, поэтому в основном,распечатка будет такой:

number : 102233
name   : Jim_Reil         age : 24
sex    : M
number : 102235
name   : Alan_Lightbrighter      age : 19
sex    : M
...

Проблема в том, что я пытаюсь идти в ногу с интервалом между именем и возрастом, но из-за длины переменной имени позиция 'age' находится не там, где яя хочу (я использовал / t для пробелов) Каков наилучший способ исправить эту проблему?

Извините, если об этом уже спрашивали тысячу раз. (Я трачу некоторое время на поиск, но думаю, что мой поискключевое слово высосано :()

Спасибо

1 Ответ

1 голос
/ 23 мая 2011

Не используйте вкладки для интервалов, поскольку это полностью зависит от капризов вашего терминала.

Определите, какое наибольшее имя может быть, и используйте printf с указателем формата %-50s (ширина 50 символов, выравнивание по левому краю) для вашего имени согласно следующей расшифровке:

$ echo '1 pax X
2 paxdiablo_with_a_very_long_name Y' | awk '{printf "%3d %-40s %s\n",$1,$2,$3}'

  1 pax                                      X
  2 paxdiablo_with_a_very_long_name          Y

Или, ближе к вашим требованиям:

$ echo '102234  James_Mckenzie      21  M
102233  Jim_Reil            24  M
102235  Alan_Lightbrighter  19  M' | awk '
    {printf "number : %d\nname   : %-20s  age : %d\nsex    : %s\n",$1,$2,$3,$4}'

number : 102234
name   : James_Mckenzie        age : 21
sex    : M
number : 102233
name   : Jim_Reil              age : 24
sex    : M
number : 102235
name   : Alan_Lightbrighter    age : 19
sex    : M

Очевидно, что 50 и 20 являются примерами - вы должны выбрать размер, который соответствует вашим потребностям. При необходимости вы можете даже просмотреть файл на первом проходе, чтобы определить наибольшее имя, а затем использовать для форматирования строку формата, созданную из этого во втором проходе, но это, вероятно, излишне.

...