设置列数据时数字列的对齐方式

Ale*_*x B 5 utilities shell-script table

我使用column -t格式化数据以便于在 shell 中查看,但似乎没有指定列对齐的选项(例如向右对齐)。

有 Bash 俏皮话可以做到这一点吗?我有任意数量的列。

Pet*_*r.O 2

更新:添加了一个脚本(但不是单行),它允许您选择要对齐的列...它适合左(默认)和右(不是中心)。按原样,它需要制表符分隔的字段。您可以通过$S更改列输出分隔符。

RJustCol=(2 3 5)  # Set columns to be right justified.
RJustRex=; Q=$'\x01'; R=$'\x02'; S=" | "
for r in ${RJustCol[@]} ;do  # Build the Right-justify regex.
  RJustRex="${RJustRex}s/^(([^\t]+\t){$((r-1))})([^\t]+)\t/\1\3$R\t/; "
done
sed -r "s/$/\tZ/g; s/^/$Q/; s/\t/\t$Q/g; $RJustRex" file |
  column -t -s $'\t' | 
    sed -r "s/  $Q/$Q/g; s/$Q([^$Q$R]*)$R([^$Q]*)/$S\2\1/g; s/$Q/$S/g; s/Z$//"
Run Code Online (Sandbox Code Playgroud)

典型输出:

| The Lost Art       |   +1255 |  789 | Los                 |     -55 | 
| of the Idle Moment | -159900 | 0123 | Fabulosos Cadillacs | +321987 | 
Run Code Online (Sandbox Code Playgroud)

注意:column当单元格为空时,它不会像您预期的那样工作。

Option -n
        By default, the column command will merge multiple adjacent
        delimiters into a single delimiter when using the --t option;
        this option disables that behavior. This option is a Debian
        GNU/Linux extension.
Run Code Online (Sandbox Code Playgroud)

从这里开始是原始答案,它与该问题相关,但并未具体解决该问题的主要问题。

这是适合整数(并允许 +/- 符号)的“一行”。“X”占位符强制column右填充最后一个单元格。

sed 's/$/\tX/g' file |column -t |sed -r 's/([-+]?[0-9.]+)( +)/\2\1/g; s/^  //; s/X$//'
Run Code Online (Sandbox Code Playgroud)

典型输出

  +1255  789  011      -55       34
-159900   33  022  +321987  2323566
Run Code Online (Sandbox Code Playgroud)

如果您有浮点值,或者浮点与整数混合,或者只是整数(可选的前导 +/- 符号),则可以进行更多的改组。

sed -r 's/$/\tX/; 
        s/([-+]?[0-9]+\.[0-9]+)\t/\1@\t/g
        s/([-+]?[0-9]+)\t/\1.@\t/g
        s/\./\t./g' file |
  column -t |
    sed -r 's/  \././g
            s/([-+]?[0-9.]+)( +)/\2\1/g
            s/\.@/ /g
            s/@//g
            s/ +X$//'
Run Code Online (Sandbox Code Playgroud)

典型输出

+1255       789   0.11   -55           34
  -15.9900   33   0.22  +321.987  2323566
Run Code Online (Sandbox Code Playgroud)