Como aplicar um script awk a vários arquivos em uma pasta usando um loop

2

Estou tentando aplicar um script awk a todos os arquivos em uma pasta, estou usando:

for %%i in (*.txt) do (awk -f NormalizeFiles.awk "%%i" > new\"%%i")

mas depois recebo a mensagem:

Syntactic error near the unexpected element '('

Eu não sei qual é o problema.

    
por LeonardoAyala 23.04.2016 / 03:30

2 respostas

2

Parece que você está tentando executar arquivos de entrada através do awk e salvar os resultados como um nome de arquivo diferente. A menos que você precise de nomenclatura de arquivos muito especial, isso deve servir:

for i in *.txt; do
    awk -f NormalizeFiles.awk $i > $i.out
done

Embora sua pergunta seja marcada como bash, sua sintaxe, como apontado por alguém, não é bash, por exemplo, o uso indevido de parênteses. A sintaxe %% não é usada corretamente e não parece pertinente ao seu objetivo. no entanto, você deve conferir link se quiser saber mais sobre isso.

    
por 23.04.2016 / 04:57
2

awk pode gravar em arquivos diferentes por si só.

por exemplo,

awk '{print > "new/"FILENAME}' *.txt

Você poderia usar algo assim em seu NormalizeFiles.awk roteiro.

Se você não quiser digitar > "new/"FILENAME para cada declaração impressa, poderá fazer algo assim:

awk 'FNR == 1 { out = "new/"FILENAME } ; { print > out }' *.txt

Isso altera o arquivo de saída (na variável out ) toda vez que o script vê a primeira linha ( FNR == 1 ) de um novo arquivo.

BTW, se o seu script tiver #!/usr/bin/awk -f como a primeira linha e for executado com chmod , você poderá executá-lo diretamente como apenas ./NormalizeFiles.awk - o mesmo que faria com um executável #!/bin/bash ou #!/usr/bin/perl script etc.

    
por 23.04.2016 / 05:39

Tags