右对齐列

右对齐列

对于命令 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

注意可读性问题,尤其是当记录之间的差异达到几个数量级时(例如倒数第二列)。顺便说一句,格式化价格以始终显示 N 位小数本身就是一个问题。但我曾使用 awk 来OFMT="%.4f"解决这个问题。

答案1

对齐和数字字段检测可以通过以下简单的程序实现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);
    }
}

另存为column.awk

要测试其工作原理,请尝试以下步骤:

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

输出为:

abc       |      -1.2|def       |         2|         3|hij

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

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

答案2

awkprintf应该能够做到这一点。有关详细信息,您应该提供有关输入和(所需)输出格式的更多信息。

相关内容