Você certamente pode fazer o awk lidar com vários arquivos por meio de curingas. Uma sugestão seria deixar o run.awk
como uma "função" genérica que leva um único arquivo e produz um único arquivo de saída, e então o chama de outro script que poderia então assimilar os arquivos de entrada e saída. / p>
Exemplo
Este seria um script Bash, podemos chamá-lo, awk_runner.bash
.
#!/bin/bash
for ifname in *.out; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done
Execução de amostra
Eu fiz um diretório de exemplo com alguns arquivos de teste.
$ touch file{1..4}.out
Isso resultou em 4 arquivos sendo feitos:
$ ls -1
file1.out
file2.out
file3.out
file4.out
Agora, executamos nosso script:
$ ./awk_runner.bash
IN: file1.out, OUT: file1.cm
running run.awk with file1.out & file1.cm
IN: file2.out, OUT: file2.cm
running run.awk with file2.out & file2.cm
IN: file3.out, OUT: file3.cm
running run.awk with file3.out & file3.cm
IN: file4.out, OUT: file4.cm
running run.awk with file4.out & file4.cm
Após cada linha que começa com "executando ...", nosso script pode ser executado a partir daqui.
Arquivos em uma lista
Diga que, em vez de usar o curinga, *.out
, em vez disso, temos um arquivo com uma lista de nomes de arquivo, digamos:
$ cat filelist.txt
file1.out
file2.out
file3.out
file4.out
Poderíamos usar esta versão modificada do nosso script que usaria um loop while
em vez de um loop for
. Agora vamos chamar essa variante do script, awk_file_runner.bash
:
#!/bin/bash
while read ifname; do
ofname=${ifname/.out/.cm}
printf "IN: %s, OUT: %s\n" $ifname $ofname
printf "running run.awk with %s & %s\n\n" $ifname $ofname
run.awk $ifname $ofname
done < filelist.txt
Esta versão do script lê a entrada do arquivo, filelist.txt
:
done < filelist.txt
Em seguida, para cada vez do loop while
, estamos usando o comando read
para ler em uma linha do arquivo de entrada.
while read ifname; do
Em seguida, ele executa tudo da mesma maneira que o primeiro script no qual ele executará o awk
script run.awk
enquanto ele percorre cada linha do arquivo.