複数のファイルに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
変数の入力方法を調整してください(例:生成)。out
out=FILENAME; sub(/\.txt$/,".out",out)
File1.out
File1.txt
ちなみに、エクスポートされていない変数名にすべて大文字を使用しないでください。Bashおよびシェルスクリプト変数の正しい大文字の使用。