XARGSでAWKを使用すると発生する問題

XARGSでAWKを使用すると発生する問題

次のコマンドの実行に問題があります -->

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スクリプトは複数のバッチの入力ファイルで呼び出され、BEGINawkが呼び出されるたびにその部分が実行されます。実行を開始する前に、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の前の偽の空白を削除しました。

おすすめ記事