使用 Printf 设置列宽格式

使用 Printf 设置列宽格式

我正在尝试使用“paste”和“awk”合并三个文件。但是,这些列并未调整为最长的字符串。所有文件的格式如下。

  • Fgge0001x
  • D 2006 年 12 月 30 日
  • 时间 14:15:20
  • 萨69
  • 乙15.8
  • MGGE06001
  • P 30.1

下面是我的错误代码。

$ paste <(awk '{print $1}' lineid) <
(awk '{printf("%-13.10s\n", $1)}' gge0001x) <
(awk '{printf("%-13.10s\n", $1)}' gge0001y) <
(awk '{printf("%-13.10s\n", $1)}' gge0001z)

此代码会导致列未对齐,如下图所示。 未对齐的列


输入文件1

F 
D 
T 
S 
B 
M 
P  
Q  
R  
U  
X 
A    
G    
H  
O  
C  
K  
W  
L  

输入文件2

gge0006x
12-30-2006
14:05:23
a69
15.4
gge06001
30.8 
19.2 
1006.2 
1012.7 
36.2
38.994   
107.71   
8.411 
37.084 
7.537 
28.198 
212.52 
68.1

输入文件3

gge0006y
12-30-2006 
14:05:55
a69
15.3
gge06001
30.6 
21.1 
1006.6 
1014.6 
36.1
38.994   
107.71   
8.433 
36.705 
7.621 
27.623 
210.51 
68 

输入文件4

gge0006z
12-30-2006
14:06:28
a69
15.7
gge06001
30.3 
23.5 
1008 
1014.1 
36.6
38.994   
107.71   
8.434 
36.508 
7.546 
27.574 
208.08 
67.6 

结果paste file1 file2 file3 file4 | column -t 在此输入图像描述

答案1

您的输入文件具有 DOS\r\n行结尾。使用dos2unix命令或使用删除回车符sed -i 's/\r$//'

答案2

该命令paste用制表符分隔条目,然后在显示时将其解释为可变数量的空格。如果您的输入已经用空格填充,您可以尝试从paste, with的输出中删除制表符| tr -d '\t',或者将每个制表符变成单个空格,with | tr '\t' ' '(在我的系统上,第一个可以使用 来实现paste -d '',但我不知道是否这是可移植的,第二个可以通过paste -d ' '; 告诉paste使用空格作为分隔符来实现)。

相关内容