faça um loop através de várias pastas e execute comandos e, em seguida, grave no arquivo

1

Eu tenho 10 pastas que quero percorrer enquanto executo o seguinte comando:

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

Com um wrapper para loop, assim:

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

Ele grava apenas _appended.dat em cada pasta e não executa o comando nos arquivos da pasta em que está realizando o loop, mas sim na pasta raiz (se houver algum).

RESULTADO DESEJADO:

Tenha um arquivo _appended.dat em cada pasta que foi gerada com o comando awk. Assim, 10 pastas com um arquivo exclusivo gerado baseiam não eh conteúdo de arquivos .csv em cada pasta.

    
por geokrowding 03.03.2015 / 08:13

1 resposta

2

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.

    
por 03.03.2015 / 08:44