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.

questionAnswers(2)

yourAnswerToTheQuestion