下面是一個AWK溶液:
# Collect all lines in "data", keep track of maximum width for each field
{
data[NR] = $0
for (i = 1; i <= NF; ++i)
max[i] = length($i) > max[i] ? length($i) : max[i]
}
END {
for (i = 1; i <= NR; ++i) {
# Split record into array "arr"
split(data[i], arr)
# Loop over array
for (j = 1; j <= NF; ++j) {
# Calculate amount of padding required
pad = max[j] - length(arr[j])
# Print field with appropriate padding, see below
printf "%*s%*s%s", length(arr[j]) + int(pad/2), arr[j], \
pad % 2 == 0 ? pad/2 : int(pad/2) + 1, "", \
j == NF ? "" : " "
}
# Newline at end of record
print ""
}
}
調用這樣的:
$ awk -f centre.awk infile
Label1 label2
Anotherlabel label2442
label152 label42242
label78765 label373737737
的printf
語句使用具有動態寬度填充:
- 第一
%*s
取關懷左邊填充和數據本身:arr[j]
被打印並填充到總寬度爲length(arr[j]) + int(pad/2)
。
- 第二個
%*s
打印空字符串,左填充到所需填充總數的一半。 pad % 2 == 0 ? pad/2 : int(pad/2) + 1
檢查總的填充是否是偶數,如果不是,則添加額外的空間。
- 最後的
%s
打印j == NF ? "" : " "
,即兩個空格,除非我們在最後一個字段。
一些較舊的awks不支持%*s
語法,但格式化字符串可以組裝像在這種情況下width = 5; "%" width "s"
。
你可能必須使用awk,python或類似的東西自己編寫它。我在這裏寫了python以獲得樂趣:https://gist.github.com/sr105/04063c756db154b5df383892c021a7fb – Harvey