使用 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;'
我是 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;'