awkでループ内のファイルを入力/出力ファイルとして使用するには?

awkでループ内のファイルを入力/出力ファイルとして使用するには?

これは間違っています:

for f in a*.dat; do 
    awk '.....' file1 "$f" > temp
    awk '.....' temp > "$f_out"
done

a*.datを入力として使用し、接尾辞_outを使用して出力として使用したいと思います。非常にありがとう

答え1

_変数名の一部と見なされるため、追加のf_out代わりにその変数を使用します。使用すると問題が解決します。fout{}

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

答え2

  1. $f変数を文字列の残りの部分と区別するには、中かっこを使用する必要があります(_out)。

    つまり、$f_out名前付き変数f_out(存在しない可能性があるため空の文字列として評価されます)を参照し、関連付けられた${f}_out変数の値を表します。f_out

  2. awkスクリプトが何をするかに応じて、おそらく(ほぼ確実に)2回実行する必要はありません。次のように、あるスクリプトの出力を別のスクリプトにパイピングすることはawkほとんど役に立ちません。awkawk

    awk '.....' file1 "$f" > temp
    awk '.....' temp > "${f}_out"
    

    実際には次のようになります。

    awk '.....' file1 "$f" | awk '.....' > "${f}_out"
    

    次のように書くことをお勧めします。

    awk '{....}; {.....}' "$f" > "${f}_out"
    

    ループで:

    for f in *.dat; do
      awk '{....}; {.....}' "$f" > "${f}_out"
    done
    

ところで、awk現在処理中のファイルのファイル名と同じ「FILENAME」という組み込み変数があります。つまり、ループが必要ない場合がありますfor。以下を実行してください。

   awk '{....}; { .... }; { print > FILENAME "_out" }' a*.dat

または、すべてのprintステートメントがで終わっていることを確認してください> FILENAME "_out"

これら2つのスクリプトの機能を正確に知らない限り、これより具体的に説明することはできませんawk

答え3

コマンドは次のようにする必要があります。

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

出力はこのようにする必要があります。それ以外の場合、シェルは変数を解釈しようとします。

f_out

関連情報