web-dev-qa-db-ja.com

ループを使用してawkスクリプトを1つのフォルダー内の複数のファイルに適用する方法

1つのawkスクリプトを1つのフォルダー内のすべてのファイルに適用しようとしています。

for %%i in (*.txt) do (awk -f NormalizeFiles.awk "%%i" > new\"%%i")

しかし、私はメッセージを受け取ります:

Syntactic error near the unexpected element '('

何が問題なのかわかりません。

2
LeonardoAyala

入力ファイルをawkで実行し、結果を別のファイル名で保存しようとしているようです。非常に特別なファイル名が必要でない限り、これは役立つはずです。

for i in *.txt; do
    awk -f NormalizeFiles.awk $i > $i.out
done

あなたの質問はbashとタグ付けされていますが、あなたの構文は誰かが指摘したように、bashではありません。括弧の誤用。 %%構文は正しく使用されておらず、目標に密接に関係していないようです。ただし、詳細については、 http://www.tldp.org/LDP/abs/abs-guide.pdf を確認してください。

4
Erik Bryer

awkは、単独で異なるファイルに書き込むことができます。

例えば.

awk '{print > "new/"FILENAME}' *.txt

NormalizeFiles.awkスクリプト内でそのようなものを使用できます。

すべての印刷ステートメントに対して> "new/"FILENAMEを入力したくない場合は、次のようにすることができます。

awk 'FNR == 1 { out = "new/"FILENAME } ; { print > out }' *.txt

これにより、スクリプトが新しいファイルの最初の行(FNR == 1)を見つけるたびに、出力ファイル(変数out内)が変更されます。

ところで、スクリプトの最初の行に#!/usr/bin/awk -fがあり、chmodを使用して実行可能にした場合、./NormalizeFiles.awkとして直接実行できます。実行可能#!/bin/bashまたは#!/usr/bin/Perlなどのスクリプトの場合と同じです。

4
cas