使用printf创建列数据

时间:2015-07-07 23:15:40

标签: perl printf multiple-columns

我是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

我尝试在print语句中的变量之前使用"%6d %9d %15.6f %28.6f %39.6f\n"来尝试将数据空出来;然而,这并没有给我我希望的专栏。任何帮助/建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

如果您正在使用Perl并执行更复杂的操作,您可能需要查看专为此类事情设计的perlformText::Table之类的模块。

至于使用printf,您可以使用填充说明符来获得一致的间距。例如,在其上使用Perl docs,确保字段宽度在.之前:您的printf字符串应该看起来更像这样(查看“精度或最大宽度”部分) :

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;'