我想使用 awk 或任何其他 UNIX 工具右对齐第三列,以便所有浮点数都相对于小数点居中。
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
如果您有任何建议,请告诉我。我尝试使用格式化方法,但对于浮点,它们似乎不起作用。
所以预期输出是
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
答案1
awk解决方案:
awk '{ for(i=1;i<=NF;i++) printf (i==1?"%s%s":"%6s%s"),$i,(i==NF? ORS:OFS) }' file
输出:
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
答案2
对于文件 z6 上的输入数据,代码:
align z6
产生:
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
(perl) 代码对齐的详细信息:
align Align columns of text. (what)
Path : ~/p/stm/common/scripts/align
Version : 1.7.0
Length : 270 lines
Type : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Help : probably available with --help
Home : http://kinzler.com/me/align/ (doc)
Modules : (for perl codes)
Getopt::Std 1.10
在这样的系统上:
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
bash GNU bash 4.3.30
align 1.7.0
最美好的祝愿...干杯,drl
答案3
awk
这可以使用's语句来完成printf
。
"%2.3f"
不起作用的原因是%f<field-width>.<precision>
因为字段宽度是字段的总宽度,包括小数点和小数部分。 <precision>
是小数点后的位数。
当您输入时,%2.3f
您可能希望小数点左边有 2 位数字,右边有 3 位数字。要实现此目的,请使用%6.3f
,只要小数点左侧有 2 位或更少的数字,它就会在小数点上对齐。
你可以试试这个:
awk '{ printf "%-6s ", $1; for (i=2; i<=NF; i++) printf "%6.3f ", $i; printf "\n"; }'
下面是相同的代码,其格式经过良好的可读性处理,并使用示例数据执行。我添加了一些额外的数据,以便您可以在输入数据长于字段宽度时看到格式化行为:
$ awk '
{
printf "%-6s ", $1;
for (i = 2; i <= NF; i++)
printf "%6.3f ", $i;
printf "\n";
}
' <<EOF
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Bundy 1.1 1.22 1.333
Jr 22.333 22.1 0.0
Longman 333.4444 4444.0 1.55555
EOF
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Bundy 1.100 1.220 1.333
Jr 22.333 22.100 0.000
Longman 333.444 4444.000 1.556
$
有关更多详细信息,请参阅awk
和手册页。printf(3)