我用column -t
格式化数据以便于在 shell 中查看,但似乎没有指定列对齐的选项(例如向右对齐)。
有 Bash 俏皮话可以做到这一点吗?我有任意数量的列。
答案1
看来较新的版本column
有右对齐选项某些列:
-R, --table-right columns
Right align text in the specified columns.
例子:
$ echo -e "a 1 2\nb 12345 678.90" | column -t -R 2,3
a 1 2
b 12345 678.90
与往常一样,RHEL/Centos 已经无可救药地过时了,并且该选项在 RHEL/Centos 7 或 8 中尚不可用(软件包util-linux
)。
答案2
从简单的角度来看,我会使用awk
column -t filename | awk '{for (i=0; i<NF; i++){l=index($0, $i)+1;printf "%*s ", index($0, $(i+1))-l, $i}printf "%*s\n", index($0, $NF)-l, $NF}'
这使得稍微更宽
答案3
更新:添加了一个脚本(但不是单行),它允许您选择要对齐的列...它适合左(默认)和右(不是中心)。按原样,它需要制表符分隔的字段。您可以通过更改列输出分隔符$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$//"
典型输出:
| The Lost Art | +1255 | 789 | Los | -55 |
| of the Idle Moment | -159900 | 0123 | Fabulosos Cadillacs | +321987 |
注意: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.
从这里开始是原始答案,它与该问题相关,但并未具体解决该问题的主要问题。
这是适合整数(并允许 +/- 符号)的“一行”。“X”占位符强制column
右填充最后一个单元格。
sed 's/$/\tX/g' file |column -t |sed -r 's/([-+]?[0-9.]+)( +)/\2\1/g; s/^ //; s/X$//'
典型输出
+1255 789 011 -55 34
-159900 33 022 +321987 2323566
如果您有浮点值,或者浮点与整数混合,或者只是整数(可选的前导 +/- 符号),则可以进行更多的改组。
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$//'
典型输出
+1255 789 0.11 -55 34
-15.9900 33 0.22 +321.987 2323566