Perlを使用してファイルの先頭に列を追加するには?

Perlを使用してファイルの先頭に列を追加するには?

私は入力ファイルの最初のフィールドがファイル名であることを確認します。そうでない場合は、ファイル名を各行の最初の列として追加するPerlの1行機能が必要です。

シェルで書かれた例:

for f in *file*.csv;
do 
  file_column=`cat ${f} | awk -F',' '{print$1}'`
  if [ $file_column != ${f} ]
  then
    sed -i "s/^/$f,/" $f 2>/dev/null;
  fi 
done

ただし、上記の方法では、最初の列にファイル名があるかどうかを確認し、それ以外の場合は4 Laksファイルに約3時間かかります。私はPerlがファイル操作にもっと速いことを知っています。

私が試したPerlコマンドは次のとおりです。

perl -p -i -e 's/^/Welcome to Hell,/' file*.csv

フィールドがすでに存在することを確認し、存在しない場合にのみ変更するロジックを追加するのに役立ちます。

Input : file1.csv 
col1,col2,col3 
data1,data2,dat3 

Output: file1.csv 
file1.csv,col1,col2,col3 
file1.csv,data1,data2,data3

またはより速い方法がある場合は、提案してください。 Perlライナーは他のシェルスクリプトの一部なので、小さな呼び出しがより良いようです(提案してください)。

ベストアンサー1

これはPerlラインです。複数のファイルパラメータに対して機能します。

perl -i -pe '/^$ARGV,/ or print "$ARGV,"' file1 file2 ...

$ARGV現在のファイルのファイル名を保持する魔法変数です。
よりhttp://perldoc.perl.org/perlvar.html#Variables-lated-to-filehandles

フィールド区切り記号(カンマ)はハードコードされています。これが問題かどうかを判断するのはあなた次第です。

小さなパフォーマンス改善:

perl -i -pe 'index($_, "$ARGV,") == 0 or print "$ARGV,"' file1 file2 ...

おすすめ記事