Columns
從文本輸出創建列但具有多個單詞列
我有以下輸出:
Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2
使用
column -t
產生以下輸出:Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2
如您所見,這看起來不太好。我需要輸出如下所示:
Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2
有誰知道這是怎么生產的?
將列分隔符更改為例如
Tab
,而不是使用column
:output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t'
這是 awk 中的一個解決方案,可以動態確定所需的列寬。每行可以有任意數量的欄位,但它假定最後一個欄位是整數。根據需要,整數被格式化為在右側排列。
格式.awk
#!/usr/bin/awk -f # Format text and numbers into two columns # Written by PM 2Ring 2015.04.16 #Gather data, line by line { #Split name from number match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a) #printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2] #Store name & number into arrays name[NR] = a[1] num[NR] = a[2] #Update field widths namelen = length(a[1]) if (namelen > maxname) maxname = namelen numlen = length(a[2]) if (numlen > maxnum) maxnum = numlen } #Print re-formatted data END{ for(i=1; i<=NR; i++) #Use printf's '*' modifier to specify field widths printf "%-*s %*d\n", maxname, name[i], maxnum, num[i] }
輸出
Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2
您可以像這樣呼叫腳本:
$ awk -f format.awk data_filename
您還可以將文本數據通過管道傳輸到其中。如果你使用
chmod
它給它執行權限,你可以像任何其他命令一樣執行它。顯然,這比 Costa
sed
用於預處理column
. 所以我建議使用它,除非你真的希望這些數字是正確的。:) OTOH,雖然這個腳本看起來比 Costa 的單線腳本大,但awk
速度非常快,所以我希望這個解決方案在速度上與 Costa 的相當,即使是非常大的數據文件。