UNIX 中以小数点为中心的列

UNIX 中以小数点为中心的列

我想使用 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)

相关内容