Como catar um arquivo do awk?

4
END {
file = "a.txt"
system(cat file)
}

Eu gostaria de fazer algo assim? (abre um arquivo cujo nome está em uma variável awk). Como isso é feito?

    
por learner 12.11.2012 / 14:03

3 respostas

4

O problema é que system () passa a linha de comando para um shell, portanto, no caso geral, você precisa escapar de todos os caracteres especiais do shell no nome do arquivo.

o awk tem uma matriz associativa ENVIRON que é mapeada para o ambiente que recebeu, mas, infelizmente, atribuí-la não afeta o ambiente dos comandos executados via system ou getline

awk -v q="'" '
   function escape(str) {
     gsub(q, q "\" q q, str)
     return q str q
   }
   BEGIN {
     file = "a.txt"
     system("cat " escape(file))
   }'

É claro que, se o arquivo for "a.txt" ou você puder ter certeza de que o caminho nunca conterá caracteres especiais do shell, você poderá usar:

system("cat " file)

Se você puder ter certeza de que não contém caracteres de aspas simples, você pode fazer:

system("cat '\''" file "'\''")
    
por 12.11.2012 / 14:48
6

getline é seu amigo:

awk 'BEGIN{file="a.txt";while ((getline<file) > 0) {print}}'
    
por 12.11.2012 / 14:15
1

Se o que você pretende fazer é definir o arquivo que deve ser processado no próprio script awk, você pode alterar o array ARGV e a variável ARGC de forma consistente:

awk 'BEGIN{ ARGV[ARGC] = "your_file.txt" ; ARGC++} {print}'
    
por 12.11.2012 / 14:32

Tags