Text-Formatting
如何很好地顯示製表符分隔文件中的列?
我有一些製表符分隔的文件,這些文件由一個非常不可讀的標題組成,因為表條目的長度不同。本質上,它看起來有點像
c1 c2 c3 c4 A 0 1.0231321321213 92 BBBBB 12321.00002131 19912132. 0 CC 0.0999813221321 0 0
有沒有一種方法可以使列間距更寬,並且列與可讀列很好地對齊,例如
c1 c2 c3 c4 A 0 1.0231321321213 92 BBBBB 12321.00002131 19912132. 0 CC 0.0999813221321 0 0
如果輸入列用簡單的空格(ASCII 空格 0x20 和/或製表符 0x09)分隔並且沒有空白列,則簡單如下:
<infile column -t c1 c2 c3 c4 ABC 0 1.0231321321213 92 BBBBB 12321.00002131 19912132. 0 CC 0.0999813221321 0 0
但是
column
,不會將輸入(ASCII 0x0d 或\r
)、換頁(ASCII 0x0c 或\f
)或垂直製表符(ASCII 0x0b 或\v
)作為分隔符處理。如果列可能用一些“空格”分隔(
[[:space:]]
類似於[ \t\r\f\v]
:空格、水平製表符、輸入、來自提要或垂直製表符(不是換行符)),您需要將所有空格折疊(並轉換)為一個分隔符(預設為空格)。不能同時使用換行符作為行分隔符和列分隔符。除了換行符,這項工作:
<infile sed 's/[[:space:]]\+/ /g' | column -t
可以減少
[…]
範圍內的空白分隔符。如果源文件中的列用單個字元(如製表符)分隔,則可以使用 shell ANSI C 擴展 (
$'…'
)(如果正在執行的 shell 具有這種能力)來聲明用作分隔符的字元。然後,使用
column
:<infile column -s $'\t' -t
列的輸出分隔符始終是空格。
如果需要接受幾個連續的分隔符(當有空白列時很有用),有一個(GNU)選項
-n
可以禁止將多個輸入相鄰分隔符合併到一個分隔符中。<infile column -s $'\t' -tn
如果源文件不是用單個字元而是用多個字元分隔的,您仍然可以在其中定義它們
$'...'
而無需額外使用sed
將它們轉換為單個字元;像 Space 或 Tabs 一樣:<infile column -s $'\t ' -tn