AWK打印格式问题

时间:2011-05-23 02:35:10

标签: printing escaping awk

我有一个包含数据的文件

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 个答案:

答案 0 :(得分:1)

不要使用制表符进行间距,因为这完全依赖于终端的变幻莫测。

找出最大的名称,并在名称上使用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

显然,5020是示例 - 您应该选择适合您需求的尺寸。如果有必要,您甚至可以在第一遍中查看文件以找出最大的名称,然后使用第二遍中构造的格式字符串进行打印,但这可能有点过分。