awk exec結果を別のフォルダにリダイレクトする[重複]

awk exec結果を別のフォルダにリダイレクトする[重複]

ファイル名パターン「_base.txt」に一致するファイルの内容を大文字に変更し、元のファイル名と「_cap.txt」を一緒に使用して結果を別のフォルダに出力します。

3,000個のファイルでこれを行う予定です。だから今、いくつかのファイルをテストしています。

まず、内容を資本化できました。ただし、出力結果はリダイレクトされません。

BASE="/home/dir/input/"
find "$BASE" -type f -iname "*.txt" -exec awk '{print toupper($0)}' {} + 

その後、以下を追加して、「_cap.txt」で終わる新しいファイル名で出力することができました。

BASE="/home/dir/input/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> (FILENAME "_cap.txt")}' {} +  

特定のフォルダに出力しようとすると問題が発生します

BASE="/home/dir/input/"
OUT_FOLDER="/home/dir/output/"
find "$BASE" -type f -iname "*_pv_bind_basefile.txt" -exec awk '{print toupper($0) >> ($OUT_FOLDER FILENAME "_cap.txt")}' {} +

次のエラーメッセージが表示されます。

awk: 無効なフィールド $()、名前 "OUT_FOLDER" 入力レコード番号 1、ファイル /home/dir/input/TAB1.a1.001.txt ソース行番号 1

ファイルを出力するために何度も繰り返しようとしましたが、数時間後に悲惨に失敗しました...私が見落としているかどうかわからない簡単なことです。どんなアドバイスも本当にありがとうございます。ありがとうございます。

答え1

シェル変数とAwk変数は異なります。

変数を環境にエクスポートすると、ENVIRONawkの配列を介してアクセスできるため、これを行うことができます(注:find質問の中核ではないため省略しました)

export OUT_FOLDER="/home/dir/output/"
awk '{print toupper($0) >> ENVIRON["OUT_FOLDER"] FILENAME "_cap.txt"}'

-vあるいは、オプションを使用して変数を渡すこともできます。

OUT_FOLDER="/home/dir/output/"
awk -v out_folder="$OUT_FOLDER" '{print toupper($0) >> out_folder FILENAME "_cap.txt"}'

関連情報