複数のフォルダを繰り返し、コマンドを実行してファイルに書き込みます。

複数のフォルダを繰り返し、コマンドを実行してファイルに書き込みます。

次のコマンドの実行中に10個のフォルダを繰り返したいと思います。

awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat

次のようにforループラッパーを使用してください。

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

各フォルダにのみ書き込みを行い、_appended.datループを通過するフォルダ内のファイルに対してコマンドを実行せずに、ルートフォルダ(存在する場合)にコマンドを実行します。

望ましい結果:

awkコマンドを使用して作成されたすべてのフォルダには_appished.datファイルがあります。したがって、10個のフォルダがあり、各フォルダには.csvファイルの内容に基づいて生成された一意のファイルがあります。

ベストアンサー1

これにより、各サブディレクトリのawkファイルに対してコマンドが実行され、そのディレクトリに出力を含む*.csvファイルが残ります。{dirname}_appended.dat

for f in */
do
    awk 'FNR > 1' "$f"/*.csv | sort -sk 1,2 | sort -sk 3,3 >"${f}${f%/}_appended.dat"
done

議論する

考慮する:

for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done

ループが実行されるたびに、*.csv現在のディレクトリのファイルが処理されます。ディレクトリ内のファイルをインポートするには、代わりにを$f使用します。"$f"/*.csv*.csv

また、上記は各実行結果をファイルに保存します。${f}_appended.dat

選ぶ

別の方法は、cd各ディレクトリに移動してawk次のコマンドを実行することです。

for f in */
do
    ( cd "$f"; awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 >"${f%/}_appended.dat" )
done

コマンドcdはサブシェル内で実行されます(括弧で区切られます)。したがって、サブシェルが終了すると、現在のディレクトリは元の値に復元されます。

おすすめ記事