Como pular um diretório no awk?
Digamos que eu tenha a seguinte estrutura de arquivos e diretórios:
$ tree
.
├── a
├── b
└── dir
└── c
1 directory, 3 files
Ou seja, dois arquivosa
eb
junto com um dirdir
, onde outro arquivoc
stands.
Eu quero processar todos os arquivos comawk
(GNU Awk 4.1.1
, exatamente), então eu faço algo assim:
$ gawk '{print FILENAME; nextfile}' * */*
a
b
awk: cmd. line:1: warning: command line argument `dir' is a directory: skipped
dir/c
Está tudo bem, mas o*
também se expande para o diretóriodir
eawk
tenta processá-lo.
Então, eu me pergunto: existe alguma maneira nativaawk
pode verificar se o elemento fornecido é um arquivo ou não e, se sim, ignorá-lo? Ou seja, sem usarsystem()
por isso.
Eu fiz funcionar chamando o externosystem
noBEGINFILE:
$ gawk 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, FNR}' * */*
a
a 10
a.wk
a.wk 3
b
b 10
dir
dir is a dir, skipping
dir/c
dir/c 10
Observe também o fato de queif (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}
funciona contador intuitivamente: ele deve retornar 1 quando verdadeiro, mas retorna o código de saída.
Eu li emA.5 Extensões no gawk Não no POSIX awk:
Os diretórios na linha de comando produzem um aviso e são ignorados (consulteDiretórios de linha de comando)E então a página vinculada diz:
4.11 Diretórios na linha de comando
De acordo com o padrão POSIX, os arquivos nomeados na linha de comando do awk devem ser arquivos de texto; é um erro fatal se não estiverem. A maioria das versões do awk trata um diretório na linha de comando como um erro fatal.
Por padrão, o gawk produz um aviso para um diretório na linha de comando, mas o ignora. Isso facilita o uso de curingas shell com seu programa awk:
$ gawk -f whizprog.awk * Directories could kill this program
Se qualquer uma das opções --posix ou --traditional for fornecida, o gawk voltará a tratar um diretório na linha de comando como um erro fatal.
VejoReaddir de exemplo de extensão, para uma maneira de tratar diretórios como dados utilizáveis de um programa awk.
E, de fato, é o caso: o mesmo comando de antes com--posix
falha:
$ gawk --posix 'BEGINFILE{print FILENAME; if (system(" [ ! -d " FILENAME " ]")) {print FILENAME, "is a dir, skipping"; nextfile}} ENDFILE{print FILENAME, NR}' * */*
gawk: cmd. line:1: fatal: cannot open file `dir' for reading (Is a directory)
Eu verifiquei o16.7.6 Reading Directories
seção que está vinculada acima e eles falam sobrereaddir
:
A extensão readdir adiciona um analisador de entrada para diretórios. O uso é o seguinte:
@load "readdir"
Mas não tenho certeza nem como chamá-lo nem como usá-lo na linha de comando.