find で見つかった各ファイルに対して awk を実行し、結果を新しいファイル名にリダイレクトします。

find で見つかった各ファイルに対して awk を実行し、結果を新しいファイル名にリダイレクトします。

findで結果を取得し、awkを実行して最初の2つの列を印刷しようとしています。次に、既存のファイル名を使用して名前にサフィックスを追加して、これらの結果を各ファイルの新しいファイル名にリダイレクトしようとします。ディレクトリ内のファイル、ソースソースはfile.txtのままで、新しいファイルの名前はfile-new.txtです。

たとえば、

find -type f -iname "*.txt" -exec awk '{print $1, $2}' {} \;

これを行うには何を追加する必要がありますか? sedを使用する方が良い選択ですか?

答え1

最も簡単な方法は、awkの出力リダイレクトを使用することです。 awk出力リダイレクトは、単純な場合に非常に使いやすいです。リダイレクトが最初に使用されたときにファイルを開き、その後、既存のファイル記述子を使用して同じファイル名にリダイレクトします。

ファイル名にサフィックスを追加するのは簡単です。

find -type f -iname "*.txt" -exec awk '{print $1, $2 >(FILENAME "-new")}' {} +

ただし、ファイル名に対してより複雑な変換を実行できます(ここでは、各入力ファイルの最初の行でのみ再計算されます)。

find -type f -iname "*.txt" -exec awk '
    FNR==1 {out=FILENAME; sub(/\.[^.]*$/, "-new&", out) || out = out "-new"}
    {print $1, $2 >out}
' {} +

関連情報