Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Printing AWK打印格式问题_Printing_Escaping_Awk - Fatal编程技术网

Printing AWK打印格式问题

Printing AWK打印格式问题,printing,escaping,awk,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 n

我有一个包含数据的文件

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
...
问题是我试图跟上姓名和年龄之间的间距,但由于姓名长度可变,“年龄”的位置不是我想要的位置(我使用/t表示间距) 解决此问题的最佳方法是什么

如果这个问题已经被问了上千次,我很抱歉。(我花了一些时间搜索,但我猜我的搜索关键词很糟糕:()


谢谢

不要使用制表符作为间距,因为这完全取决于终端的变化

找出最大的名称可能是什么,并使用
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
就是一个例子——你应该选择一个适合你需要的大小。如果必要的话,你甚至可以在第一次遍历文件时计算出最大的名称,然后在第二次遍历时使用由该文件构造的格式字符串进行打印,但这可能有些过分了