使用 printf 创建柱状数据

using printf to create columnar data

我是 perl 和一般脚本的新手。我有五个保存数据的变量,我需要将它们打印为彼此相邻的五列。这是我现在的代码。

$i = 0;
foreach $line (<inf>){
    chomp $line;
    @line=split / +/, $line;
    $i = $i + 1;
    if ($i > $n+1) {
        $i = 1;
        $numdata = $numdata + 1;
    }
    if ($i == 1) {
        printf "%20s\n", $n, "\n";
    } else {
        print  $i-1, "BEAD", $line[$col], $line[$col+1], $line[$col+2], "\n";
    }
    # other statistics
}

我从中得到的输出如下:

                   5
1BEAD0.00000e+000.00000e+000.00000e+00
2BEAD0.00000e+000.00000e+000.00000e+00
3BEAD0.00000e+000.00000e+000.00000e+00
4BEAD0.00000e+000.00000e+000.00000e+00
5BEAD0.00000e+000.00000e+000.00000e+00
                   5
1BEAD9.40631e-02-3.53254e-022.09369e-01
2BEAD-6.69662e-03-3.13492e-012.62915e-01
3BEAD2.98822e-024.60254e-023.61680e-01
4BEAD-1.45631e-013.45979e-021.50167e-01
5BEAD-5.57204e-02-1.51673e-012.95947e-01
                   5
1BEAD8.14225e-028.10216e-022.76423e-01
2BEAD2.36992e-02-2.74023e-014.47334e-01
3BEAD1.23492e-011.12571e-012.59486e-01
4BEAD-2.05375e-011.25304e-011.85252e-01
5BEAD5.54441e-02-1.30280e-015.82256e-01

我试过在打印语句中的变量前使用 "%6d %9d %15.6f %28.6f %39.6f\n" 来尝试 space 输出数据;但是,这并没有给我希望的专栏。感谢任何帮助/建议。

如果您正在使用 Perl 并做更复杂的事情,您可能需要查看 perlform, which is designed for this kind of thing, or a module like Text::Table

不过,至于使用 printf,您可以使用填充说明符来获得一致的间距。例如,在其上使用 Perl docs,确保字段宽度在 . 之前:您的 printf 字符串可能看起来更像这样(查看 "precision, or maximum width" 部分):

printf "%6.d %9.d %15.6f %28.6f %39.6f"

此外,如果您的东西在一个数组中,您只需将数组的第二个参数传递给 printf 并省去自己输入所有内容的麻烦。我还在您示例中的其他两项前面添加了 unshift:

unshift(@line, $i-1, "BEAD");
printf "%6.d %10s %15.6f %28.6f %39.6f\n", $line;

请注意 %s 占位符 没有 具有 . 精度说明符,因此请将其保留。如果您想要数字的电子符号,请使用%e%g而不是%f%39.6e)。

此外,对于 Perl 问题,请始终查看 Perl Monks - 此答案的大部分来自 a question there

P.S。鉴于您的示例列之一,这是我试图确保一切正常的概念验证脚本:

perl -e '@line = (8.14225e-02,8.10216e-02,2.76423e-01);
    unshift(@line, 4, "BEAD");
    printf "%6.d %10s %15.6f %28.6f %39.6e\n", @line;'