右对齐列

Mar*_*cos 4 text command-line bash

对于命令 shell,是否有类似的通用程序column可以选择将特定列或所有列向右对齐,如果没有也检测数字字段并自动为这些字段执行此操作?

否则,文本处理命令最简洁的方法是什么?

示例以空格分隔的输入已通过管道传输| column -t

TVN         20120419  10.08  10.08  9.15   9.6    1630000  9.17    20120419  4.6      83.88   7376600    -0.21858
INTEGERPL   20120419  143.1  148.9  140.3  142.5  2910     138.53  20120405  4.32503  5.55    1642500    1.26158
JSW         20120419  93.55  94.4   91.25  92.7   116000   90.07   20120329  3.86997  8.54    13155770   1.29315
KERNEL      20120419  73.7   74.9   72.9   74.1   56200    71.8    20120404  3.48432  10.71   2819790    1.50892
EUROCASH    20120419  39.49  41.99  39.01  40.73  812000   38.05   20120328  4.85095  20.21   5280548    2.46091
PEKAO       20120419  145.9  147.8  144.0  145.5  292000   140.2   20120404  3.70615  5.48    68858748   2.63889
PKNORLEN    20120419  38.0   38.5   37.25  37.35  1230000  36.26   20120329  4.15476  21.21   104607200  2.65772
Run Code Online (Sandbox Code Playgroud)

注意可读性问题,尤其是。其中记录之间的差异有几个数量级(如倒数第二列)。顺便说一下,格式化价格以始终显示 N 个小数位本身就是一个问题。但是我OFMT="%.4f"为此使用了 awk 。

lga*_*rzo 5

对齐和数字字段检测可以通过以下简单awk程序来实现。

{
    width=10;
    separator="|";

    for (i=1; i<=NF; i++) {
        if (match($i, /[-+]*[0-9]+[\.]*[0-9]*/)) {
            printf("%"width"s", $i);
        }
        else { 
            printf("%-"width"s", $i);
        }
        if (i == NF) printf("\n");
        else printf("%s", separator);
    }
}
Run Code Online (Sandbox Code Playgroud)

将其另存为column.awk.

要测试它是如何工作的,请尝试以下操作:

echo "abc -1.2 def 2 3 hij" | awk -f column.awk

输出是:

abc       |      -1.2|def       |         2|         3|hij
Run Code Online (Sandbox Code Playgroud)

.awk脚本中有 2 个可调参数:

  • 宽度:默认字段(用于对齐)
  • 分隔符:用于分隔输出列