Text-Formatting

如何很好地顯示製表符分隔文件中的列?

  • June 9, 2018

我有一些製表符分隔的文件,這些文件由一個非常不可讀的標題組成,因為表條目的長度不同。本質上,它看起來有點像

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

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