親ディレクトリには、スペースで区切られた1つ以上のテキストファイルを含む複数のサブディレクトリがあります。
私が望むものを出力しますが、単一のファイルにのみ出力する次のコマンドがあります。INPUTFILE.txt
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' INPUTFILE.txt
何千ものサブディレクトリがあり、ファイル名が異なることを考えると、このコマンドを親ディレクトリのすべてのサブディレクトリにどのように適用できますか?
答え1
まず、cd
目的の親ディレクトリに移動します。
次に、次を使用してコマンドをfind
実行しますawk
。
find -type f -exec awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' {} +
説明する
- 既定では既に再帰的であるため、すべてのサブディレクトリに対してこれを行います。
-type f
f
ファイルやディレクトリ以外のファイルに検索を制限します。- この
-exec somecommand {} +
構文はコマンドを実行し、見つかったファイルパスをユーザーが作成した場所に配置します。{}
- このオプションは、クエリ結果をパラメータとして保存しながら1つ
+
のインスタンスのみを実行するため、より効率的です。一方、これを実行する別の方法(ここには示されていません)は、各ファイル名に対して一度awkを実行し、それほど効率的ではありません。awk
{}
答え2
素早く素早く汚い方法はループを使用することですが、まず何かを設定する必要があります。以下に、awkコマンドを実行したいファイルの名前とパスを含むテキストファイルを示します。親ディレクトリで実行する必要があります。
find . -type f -print >> source.txt
次にループを実行します。
for i in $(cat source.txt); do
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> OUTPUTFILE.txt
done
単一の出力ファイルが必要かどうか、複数の出力ファイルが必要かどうかはわかりません。
複数の出力ファイルが必要な場合は、次のことができます。
for i in $(cat source.txt); do
awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> $i.processed.txt
done
答え3
修正する:回答を書いた後、質問が変わりました。
for a in */INPUTFILE.txt
do
cp "$a" "$a.bak"
YOUR-AWK "$a.bak" > "$a"
done
新しい質問がおかしいようですね!正しく理解したら
YOUR-AWK */*.txt > output.txt