我的代码有效,除了它在输出文件的开头打印一些垃圾。我可以手动删除它,但更喜欢我的脚本工作。输入文件是由","分隔的19列数字数据。 (逗号空间),第0行的每列标题(我想跳过,另一个问题)。
我用./column3Minus8.pl INPUTFILE>来调用我的文件。 output.txt的
#!/usr/bin/perl
use strict;
while(<>) {
my @columns = split ", ", $_;
$columns[3] = sprintf("%.5f", $columns[3] - 8);
print join ", ", @columns;
}
output.txt开头的垃圾是
#!/usr/bin/perl
, , , -8.00000
, , , -8.00000use strict;
, , , -8.00000
, , , -8.00000while(<>) {
, , , -8.00000 my @columns = split ", ", $_;
, -8.00000 $columns[3] = sprintf("%.5f", $columns[3] - 8);
, , -8.00000 print join ", ", @columns;
, -8.00000}, , , -8.00000
EDITFIX:我在命令行调用中两次调用perl文件导致垃圾。 &#34; ./ column3Minus8.pl column3Minus8.pl INPUTFILE&gt; OUTPUT.TXT&#34;哎呀。我仍然想知道如何跳过第一行。并替换常量。
TODO:用var替换常量8。跳过第0行,不进行编辑。
答案 0 :(得分:2)
您的计划仍然存在一些小问题。您还应该有use warnings
,如果您要修改 last 列,则每行应chomp
。
该程序添加必要的代码,从命令行中取出第四列的值,并复制文件的第一行。
您应该将其作为
运行column3minus.pl 8 inputfile > outputfile
#!/usr/bin/perl
use strict;
use warnings;
my $delta = shift;
print scalar <>; # Duplicate first line
while (<>) {
chomp;
my @columns = split /,\s*/;
$columns[3] = sprintf '%.5f', $columns[3] - $delta;
print join(', ', @columns), "\n";
}