Bash

使用 Printf 格式化列寬

  • November 17, 2018

我正在嘗試使用“粘貼”和“awk”合併三個文件。但是,這些列並未調整為最長的字元串。所有文件的格式與以下相同。

  • F gge0001x
  • 2006 年 12 月 30 日
  • 時間 14:15:20
  • 薩69
  • 乙 15.8
  • MG06001
  • 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 在此處輸入圖像描述

您的輸入文件有 DOS\r\n行結尾。dos2unix使用命令或使用刪除輸入符sed -i 's/\r$//'

該命令paste用製表符分隔條目,然後在顯示時將其解釋為可變數量的空格。如果您的輸入已經用空格填充,您可以嘗試從paste, with的輸出中刪除選項卡| tr -d '\t',或者將每個選項卡變成一個空格,with | tr '\t' ' '(在我的系統上,第一個可以使用 來實現paste -d '',但我不知道是否這是可移植的,第二個可以通過paste -d ' '; 告訴paste使用空格作為分隔符來實現)。

引用自:https://unix.stackexchange.com/questions/197663