Como testar se uma função está definida no awk?

4

Estou escrevendo um programa awk e quero executá-lo com mawk e gawk . Eu preciso de uma função de classificação. Eu escrevi o meu próprio, mas eu quero usar a função asort() em gawk se disponível.

Como sei de dentro do meu programa se a função asort() está disponível?

Mais geralmente, como posso testar se uma função (por exemplo, gensub() ) está disponível?

    
por small_awk 23.08.2011 / 15:20

2 respostas

2

Posso sugerir um hack para determinar se você está executando mawk ou gawk . Aqui está

BEGIN {
  file = ARGV[0] " -W version 2>&1 | head -1"
  file | getline
  if ($1 == "mawk")
    print "mawk"
  else if ($2 == "Awk")
    print "gawk"
  close(file)
}
    
por 23.08.2011 / 15:47
2

Não há uma maneira portátil de testar se existe uma função no Awk. Se você está chamando o script Awk de um shell, você pode fazer chamadas Awk para testar a existência de funções primeiro.

if awk 'BEGIN {asort(a)}' <>/dev/null 2>/dev/null; then
  define_asort=
else
  define_asort='
function asort() { … }
'
fi
awk "$define_asort"'
  … rest of script …
'

Se você está apenas tentando distinguir o GNU Awk dos outros, você pode testar algum outro recurso do GNU Awk. Chamar funções indefinidas causa um erro fatal no Awk, mas usar uma variável indefinida é sempre bom e retorna um valor vazio. Você pode usar, em particular, PROCINFO[version] , que desde o Gawk 3.1.4 contém o número da versão do Gawk.

function my_sort(a) { … }
function sort_wrapper(a) { if (PROCINFO["version"]) asort(a); else my_sort(a); }
    
por 24.08.2011 / 00:12

Tags