私は入力ファイルの最初のフィールドがファイル名であることを確認します。そうでない場合は、ファイル名を各行の最初の列として追加する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 ...