我从 Unix 管道中得到了一些制表符分隔的数据。我想将这些数据格式化为一个紧凑的人类可读表格。
如何将这些制表符扩展为空格,并根据字段数据的宽度自动设置制表位?
例如,我的假设generate_tsv
脚本可能会产生(我用来\t
表示实际的制表符)-
alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tok
gamma\t\t-1.0\tinvalid
使用| expand -t 12
,我会得到:
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
但我想要更紧凑的东西(所以有两个空格分隔列),如下所示:
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
正如 @jw013 所建议的,| column -t -s $'\t'
很接近,但并不完全正确,因为它折叠了空单元格:
alpha 1 0.21085026 ok
beta 4096 0.0 ok
gamma -1.0 invalid
答案1
如果您有column(1)
一个旧的 BSD 工具,请尝试使用column -t
来打印漂亮的表格。
为了确保显示空单元格,您可以尝试在每个空单元格中插入一个空格的方法(可以通过两个连续的选项卡识别)。这个想法是column(1)
应该给空格字符自己的列,但作为宽度上的单个字符,它不应该影响表格尺寸或在输出中对人类可见。
generate_tsv |
awk '/\t\t/ { for (i = 0; i < 2; i++) gsub(/\t\t/, "\t \t") } 1' |
column -t -s $'\t'
管道中插入的额外内容awk
会将空格插入到每个空单元格中,如上所述。需要 2 遍才能处理 2 个连续的空单元格 ( \t\t\t
)。
答案2
这是一种迂回的方法,但它有效并且具有column
.
它制作表格,考虑空行和空单元格。
它可以并排连接多个文件。例如。前缀行“F1”行来自“铌”
空行显示为空单元格(对于多文件粘贴)
文件可以具有不同的长度。
# Make test data file
echo -e "alpha\t1\t0.21085026\tok
beta\t4096\t0.0\tnext F1 line is blank
gamma\t\t-1.0\tinvalid" >F1
sed -n '=' F1 >Nb
echo -e "\tB\tC\textra F1 line" >>F1
# Set the positional parameters $1, $2
set Nb F1
{ echo -e "<html>\n<table border=1 cellpadding=0 cellspacing=0>"
paste "$@" |sed -e 's#\(.*\)#\x09\1\x09#
s#\x09# </pre></td>\n<td><pre> #g
s#^ </pre></td>#<tr>#
s#\n<td><pre> $#\n</tr>#'
echo -e "</table>\n</html>"
}|w3m -dump -T 'text/html'
表格版本的输出:
┌───┬───────┬──────┬────────────┬───────────────────────┐
│ 1 │ alpha │ 1 │ 0.21085026 │ ok │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 2 │ beta │ 4096 │ 0.0 │ next F1 line is blank │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 3 │ │ │ │ │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ 4 │ gamma │ │ -1.0 │ invalid │
├───┼───────┼──────┼────────────┼───────────────────────┤
│ │ │ B │ C │ extra F1 line │
└───┴───────┴──────┴────────────┴───────────────────────┘
要获得无框版本,只需拆除框架即可。这可以通过将输出进一步管道化来轻松完成,如以下代码行所示,它是替代品对于上面表格版本的最后一行。
# the replacement "new" last line
}|w3m -dump -T 'text/html' |sed -r '/^┌|├|└/d; s/^│ //g; s/ │$//g; s/ │ /│/g'
这是“新”输出:我已将垂直分隔线保留在适当的位置。如果您不需要它们,只需将最后一个 sed 表达式更改为您喜欢的任何内容即可。
1│alpha│1 │0.21085026│ok
2│beta │4096│0.0 │next F1 line is blank
3│ │ │ │
4│gamma│ │-1.0 │invalid
│ │B │C │extra F1 line
或者,将 替换 / │ /
为/ /
(2 个空格),看起来是这样的。
1 alpha 1 0.21085026 ok
2 beta 4096 0.0 next F1 line is blank
3
4 gamma -1.0 invalid
B C extra F1 line
当然,前导数字只是为了演示并排文件“粘贴”。