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