次のコマンドの実行に問題があります -->
find . -type f -name 'out*' |
xargs awk 'BEGIN{print "Filename, Energy"}/TOTAL ENERGY/{print FILENAME, "," $4}' >> energy.csv
出力ファイルのすべてのディレクトリを調べてエネルギーを解析し、ヘッダー列を使用してEnergy.csvファイルに書き込もうとしています。
問題は、ファイルの途中にヘッダー列を複数回書き込む場合がありますが、必ずしもそうではないということです。私はこの動作を理解していません。
ベストアンサー1
xargs
(またはfind
)は、ユーザーが指示したコマンドを呼び出して、一度に必要な数のファイル名を渡します。常にARG_MAX
オーバーランを引き起こすよりも少ない。
したがって、awkスクリプトは複数のバッチの入力ファイルで呼び出され、BEGIN
awkが呼び出されるたびにその部分が実行されます。実行を開始する前に、awkスクリプトの外部でヘッダー行を初期印刷することでこの問題を回避できますfind
。
したがって、次のようにします。
{
ofs=','
printf '%s%s%s\n' 'Filename' "$ofs" 'Energy' &&
find . -type f -name 'out*' |
xargs awk -v OFS="$ofs" '/TOTAL ENERGY/{print FILENAME, $4}'
} > energy.csv
または次のようになります(コマンド自体を呼び出すことができるため、出力を強力にパイプするfind
必要はありません)。xargs
{
ofs=','
printf '%s%s%s\n' 'Filename' "$ofs" 'Energy' &&
find . -type f -name 'out*' -exec \
awk -v OFS="$ofs" '/TOTAL ENERGY/{print FILENAME, $4}' {} +
} > energy.csv
また、awk部分をより慣用的にし、,
ヘッダのsの後と,
残りの出力のsの前の偽の空白を削除しました。