Columns

從文本輸出創建列但具有多個單詞列

  • April 16, 2015

我有以下輸出:

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它給它執行權限,你可以像任何其他命令一樣執行它。

顯然,這比 Costased用於預處理column. 所以我建議使用它,除非你真的希望這些數字是正確的。:) OTOH,雖然這個腳本看起來比 Costa 的單線腳本大,但awk速度非常快,所以我希望這個解決方案在速度上與 Costa 的相當,即使是非常大的數據文件。

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