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

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

我有一些制表符分隔的文件,其中包含的标头由于表条目的长度不同而非常难以读取。本质上,它看起来有点像

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

答案1

如果输入列用简单的空格(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它们转换为单个字符;例如空格或制表符:

<infile column -s $'\t ' -tn

相关内容