Isso executará o comando awk
nos arquivos *.csv
em cada subdiretório, deixando para trás um arquivo {dirname}_appended.dat
nesse diretório contendo a saída:
for f in */
do
awk 'FNR > 1' "$f"/*.csv | sort -sk 1,2 | sort -sk 3,3 >"${f}${f%/}_appended.dat"
done
Discussão
Considere:
for f in */ ; do awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 > ${f}_appended.dat; done
Em cada execução do loop, isso processa os arquivos *.csv
no diretório atual. Para obter os arquivos no diretório $f
, use "$f"/*.csv
no lugar de *.csv
.
Além disso, o acima coloca os resultados de cada execução no arquivo ${f}_appended.dat
Alternativa
Outra abordagem é cd
em cada diretório e execute o comando awk
:
for f in */
do
( cd "$f"; awk 'FNR > 1' *.csv | sort -sk 1,2 | sort -sk 3,3 >"${f%/}_appended.dat" )
done
O comando cd
é executado dentro de um subshell (delimitado por parênteses). Conseqüentemente, o diretório atual é restaurado para seu valor original assim que a sub-rede sai.