awk: variável FILENAME incorporada no arquivo vazio

5

Por que a variável FILENAME de awk não retorna nada quando a entrada é um arquivo vazio? Isso significa que awk não abre esse arquivo? Se não abrir, como sabe que está vazio, ou se está aberto, por que não retorna o nome do arquivo?

Eu leio esta postagem , mas não expliquei por que a seguir deve funcionar.

awk 'BEGINFILE{print FILENAME}1' filename

e abaixo não.

awk '{print FILENAME}' filename #or
awk 'BEGIN{print FILENAME}' filename
    
por αғsнιη 21.10.2017 / 15:30

2 respostas

6

Do manual awk :

FILENAME  A  pathname  of  the  current input file.
Inside a BEGIN action the value is undefined.  (...)

Eu acho que esta é a explicação. Até que um campo seja processado, o valor de FILENAME é indefinido. Como nenhum campo é processado no caso de um arquivo vazio, a variável permanece não inicializada.

    
por 21.10.2017 / 15:36
2

Observação: partes desta resposta são específicas do GNU awk , especificamente 4.0 e posterior, que foram adicionados BEGINFILE / ENDFILE

awk '{print "File name: " FILENAME}' myfile

Isso imprimirá File name: myfile uma vez para cada linha no myfile. Se myfile for um arquivo em branco (zero bytes), ele não conterá linhas e, portanto, a string acima não será impressa.

awk 'BEGINFILE{print "File name: " FILENAME}' myfile

Se suportado, isso imprimirá File name: myfile uma vez, antes de processar as linhas. (Caso contrário, ele provavelmente decidirá que BEGINFILE é variável com um valor falso e não imprimirá nada.)

awk 'BEGIN{print "File name: " FILENAME}' myfile

Esse bloco é avaliado antes que qualquer um dos arquivos seja processado e, neste momento, o valor de FILENAME é não definido .

A gawk documentação define especificamente como "" , então nós podemos saber que apenas imprimirá File name: .

    
por 06.10.2018 / 01:45

Tags