对于命令 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
:
- 宽度:默认字段(用于对齐)
- 分隔器:用于分隔输出列