如何根据内容扩展选项卡?

如何根据内容扩展选项卡?

我从 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        

当然,前导数字只是为了演示并排文件“粘贴”。

相关内容