我想在执行以下命令时循环遍历 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
命令在子 shell 内运行(由括号分隔)。因此,一旦子 shell 退出,当前目录就会恢复为其原始值。