Perl - 通过在第一列加 1 来更新文件的内容
Perl - update contents of a file by adding 1 on the first column
我正在寻找一种更好的方法来在文件第一列的内容上添加 1。我读取了一个文件并通过添加 1 更新了第一列的内容。
我的输入文件:(sparc_export.test)
export
3066
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10500 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
... 3000多行。
我想要的文件是:(sparc_export.test)
export
3066
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10501 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
我正在以 2x2 数组的形式读取文件,并为从第 3 行到末尾的每个内容加 1,但我认为这不是一个好方法。请让我知道更新文件内容的更好方法。
#!/usr/bin/perl
use strict;
use warnings;
my $exportname="sparc_export.test";
#### read sparc_export.test
open(CSV,$exportname)||die("Cannot open export file $!");
my @export;
while(<CSV>){
my @row=split(/ /,$_);
push(@export,\@row);
}
for (my $i=2; $i < (scalar @export); $i +=1) {
$export[$i][0]= $export[$i][0]+1;
}
open(my $fh4, '>', 'sparc_export.test');
print $fh4 join("\n", @export);
close $fh4;
这可以很容易地通过一个简短的命令而不是一个完整的程序来完成:
perl -pe 's/(\d+)/ + 1/e if $. > 2' sparc_export.test > sparc_export_incremented.test
-p
标志将整个程序包裹在输入文件行的 while 循环中,if $. > 2
将修改限制为行号大于 2 的行。
回复您的评论:
要替换原始文件而不是创建新文件,您可以说:
perl -i.bak -pe 's/(\d+)/ + 1/e if $. > 2' sparc_export.test
这会将原始文件保存在名称 sparc_export.test.bak
下。您可以只说 -i
而不是 -i.bak
来不创建备份文件。
从 Perl 程序中调用 Perl 命令会很奇怪,但可以做到:
system('perl', '-i.bak', '-pe', 's/(\d+)/ + 1/e if $. > 2', 'sparc_export.test');
更典型的是在主程序中完成工作:
open my $in, '<', 'sparc_export.test' or die "Can't open file: $!";
open my $out, '>', 'sparc_export.test.out' or die "Can't open file: $!";
while (<$in>) {
s/(\d)/ + 1/e if $. > 2;
print $out $_;
}
close $out;
close $in;
rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!";
我正在寻找一种更好的方法来在文件第一列的内容上添加 1。我读取了一个文件并通过添加 1 更新了第一列的内容。
我的输入文件:(sparc_export.test)
export
3066
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10500 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10500 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
... 3000多行。
我想要的文件是:(sparc_export.test)
export
3066
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rcc_data_e[6]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[51]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[3]
10501 cmp_top.iop.sparc0.exu.alu.shft_alu_shift_out_e[18]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs3_data_e[17]
10501 cmp_top.iop.sparc0.exu.alu.byp_alu_rs1_data_e[43]
我正在以 2x2 数组的形式读取文件,并为从第 3 行到末尾的每个内容加 1,但我认为这不是一个好方法。请让我知道更新文件内容的更好方法。
#!/usr/bin/perl
use strict;
use warnings;
my $exportname="sparc_export.test";
#### read sparc_export.test
open(CSV,$exportname)||die("Cannot open export file $!");
my @export;
while(<CSV>){
my @row=split(/ /,$_);
push(@export,\@row);
}
for (my $i=2; $i < (scalar @export); $i +=1) {
$export[$i][0]= $export[$i][0]+1;
}
open(my $fh4, '>', 'sparc_export.test');
print $fh4 join("\n", @export);
close $fh4;
这可以很容易地通过一个简短的命令而不是一个完整的程序来完成:
perl -pe 's/(\d+)/ + 1/e if $. > 2' sparc_export.test > sparc_export_incremented.test
-p
标志将整个程序包裹在输入文件行的 while 循环中,if $. > 2
将修改限制为行号大于 2 的行。
回复您的评论:
要替换原始文件而不是创建新文件,您可以说:
perl -i.bak -pe 's/(\d+)/ + 1/e if $. > 2' sparc_export.test
这会将原始文件保存在名称 sparc_export.test.bak
下。您可以只说 -i
而不是 -i.bak
来不创建备份文件。
从 Perl 程序中调用 Perl 命令会很奇怪,但可以做到:
system('perl', '-i.bak', '-pe', 's/(\d+)/ + 1/e if $. > 2', 'sparc_export.test');
更典型的是在主程序中完成工作:
open my $in, '<', 'sparc_export.test' or die "Can't open file: $!";
open my $out, '>', 'sparc_export.test.out' or die "Can't open file: $!";
while (<$in>) {
s/(\d)/ + 1/e if $. > 2;
print $out $_;
}
close $out;
close $in;
rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!";