2017-03-08 5 views
0

ファイルの最初のカラムの内容に1を追加するより良い方法を探しています。私は1Perl - 最初のカラムに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; 

答えて

4

これはほんの短いコマンドではなく、完全なプログラムを非常に簡単に行うことができる。

perl -pe 's/(\d+)/$1 + 1/e if $. > 2' sparc_export.test > sparc_export_incremented.test 

-pフラグは、入力ファイルの行上whileループでプログラム全体を包み込み、そしてif $. > 2は、行番号があなたのコメントへの応答2.

より大きい行への変更を制限します。

元のファイルを置き換えるのではなく、新しいものを作成するには、言うことができる:

名前 sparc_export.test.bakの下に元のファイルを保存します
perl -i.bak -pe 's/(\d+)/$1 + 1/e if $. > 2' sparc_export.test 

。バックアップファイルを作成しない場合は、-i.bakではなく、ちょうど-iと言うことができます。

Perlプログラム内からPerlのコマンドを呼び出すことは非常に奇妙なことだろうが、それは行うことができます。

system('perl', '-i.bak', '-pe', 's/(\d+)/$1 + 1/e if $. > 2', 'sparc_export.test'); 

より典型的には、1つのメインプログラムの内部で作業をするでしょう:

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 + 1/e if $. > 2; 
    print $out $_; 
} 
close $out; 
close $in; 
rename 'sparc_export.test.out', 'sparc_export.test' or die "Failed to rename: $!"; 
+0

これは素晴らしいことです。簡単な質問ですどうすればいいですか?ファイルを更新するだけで、新しいファイルを作成しない場合はどうすればいいですか? –

+0

申し訳ありませんが、もう1つ。トップのperlスクリプトでone-linerを呼び出すことは可能ですか?私は使用しました:system( 'perl'、$ script)== 0またはdie "は$ script:\ $?= $?を実行できませんでした。一番上のperlスクリプトで別のperlスクリプトを呼び出すことはできますが、私はその一行のperlをどのように呼び出すのか分かりません。 –

+1

私はあなたのコメントに答えるために私の答えを更新しました。 – Sean

関連する問題