bashループでawk

bashループでawk

複数のファイルにawkを適用する方法は?次のスクリプトは何もしません。

FILE=/media/linux/*.txt
for f in $FILES
do
    awk '{printf("%.4f %8.2f     1.000     1    1\n", $2, $4)}' $f > test$f.out
done

答え1

FILE=(単数)と(複数)がありますfor f in $FILES。それに加えて、echo次の2つのステートメントの出力の違いを見てください。

$ ls tmp
File-0  File-1  File-2  File-3

$ files=tmp/File*
$ echo "$files"
tmp/File*

$ files=( tmp/File* )
$ echo "${files[@]}"
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3

以下を使用して、最初のコード部分からファイルのリストを取得できます。

$ files=tmp/File*
$ echo $files
tmp/File-0 tmp/File-1 tmp/File-2 tmp/File-3

ただし、問題/警告に関連する引用符のない変数を導入します。https://mywiki.wooledge.org/Quotes

したがって、何らかの理由でループを作成するには、次のようにします。

files=( tmp/File* )
for f in "${files[@]}"; do
    awk 'script' "$f"
done

または、ループなしでこれを実行できます。

files=( tmp/File* )
awk 'script' "${files[@]}"

それ以外の場合:

awk 'script' tmp/File*

非ループコマンドを使用して各入力ファイルに固有の出力ファイルを提供する場合:

awk 'FNR==1{close(out); out=FILENAME ".out"} {print > out}' tmp/File*

File1.txt.outこれにより、入力ファイルから出力ファイルが生成されます。別の名前付け変換が必要な場合は、File1.txt変数の入力方法を調整してください(例:生成)。outout=FILENAME; sub(/\.txt$/,".out",out)File1.outFile1.txt

ちなみに、エクスポートされていない変数名にすべて大文字を使用しないでください。Bashおよびシェルスクリプト変数の正しい大文字の使用

関連情報