awk에 함수가 정의되어 있는지 테스트하는 방법은 무엇입니까?

awk에 함수가 정의되어 있는지 테스트하는 방법은 무엇입니까?

프로그램 을 작성 awk중인데 . 정렬 기능이 필요합니다. 나만의 함수를 작성했지만 가능하다면 내장 함수를 사용하고 싶습니다.mawkgawkasort()gawk

asort()이 기능을 사용할 수 있는지 프로그램 내에서 어떻게 알 수 있나요 ?

gensub()보다 일반적으로 특정 기능(예:)을 사용할 수 있는지 여부를 어떻게 테스트합니까 ?

답변1

Awk에 함수가 존재하는지 테스트할 수 있는 이식 가능한 방법은 없습니다. 쉘에서 Awk 스크립트를 호출하는 경우 먼저 Awk 호출을 만들어 함수가 존재하는지 테스트할 수 있습니다.

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 …
'

GNU Awk를 다른 기능과 차별화하고 싶다면 다른 GNU Awk 기능을 테스트해 볼 수 있습니다. Awk에서 정의되지 않은 함수를 호출하면 치명적인 오류가 발생하지만 정의되지 않은 변수를 사용하는 것은 항상 문제가 없으며 null 값을 반환합니다. PROCINFO[version]Gawk 3.1.4부터 구체적으로 사용할 수 있으며 여기에는 Gawk 버전 번호가 포함됩니다.

function my_sort(a) { … }
function sort_wrapper(a) { if (PROCINFO["version"]) asort(a); else my_sort(a); }

답변2

실행 중인지 확인하기 위해 해킹을 제안할 수 mawk있습니다 gawk.

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)
}

답변3

다음을 수행할 수 있습니다.

awk 'BEGIN {has_asort = (asort (x)) == "0"}
     function my_asort(a) {
       if (has_asort) return asort (a)
       ...
     }
     ...

asort와 사이의 공백이 (x)중요합니다. awk지원되지 않는 구현 에서는 1 에 연결된 변수 asort()로 해석됩니다 . 그렇지 않으면 함수가 존재하지 않는다는 오류가 발생합니다 .asortxasort()

따라서 asort()정의되지 않은 배열에서 호출하여 이것이 지원되는지 알 수 있으며, x이 경우 를 반환 0하지만, awk이를 지원하지 않는 s에서는 정의되지 않은 두 변수를 연결하여 null 문자열이 생성됩니다.

답변4

다음은 Ubuntu 20.04의 gawk 5.0.1에 적용됩니다.

#!/usr/bin/awk -f
@load "rwarray" # just to show how extensions look
function DoSomething(a, b){
  return a * b
}
BEGIN {
  PROCINFO["sorted_in"] = "@ind_str_asc" # options are @unsorted, @ind_str_asc, @ind_num_asc, @val_type_asc, @val_str_asc, @val_num_asc; also ..._desc
  for(_key in PROCINFO["identifiers"]){
    _val = PROCINFO["identifiers"][_key]
    if(_val ~ /scalar$/) { continue }
    if(_val ~ /array$/) { continue }
    if(_val ~ /untyped$/) { continue }
    if(_val ~ /builtin$/) { continue } # It Depends (tm) - do you want builtin functions or not?
    print _key " = " _val
  }
}

다음과 같이 인쇄됩니다.

DoSomething = user
reada = extension
writea = extension

또는

DoSomething = user
and = builtin
asort = builtin
asorti = builtin
atan2 = builtin
bindtextdomain = builtin
close = builtin
compl = builtin
cos = builtin
dcgettext = builtin
dcngettext = builtin
exp = builtin
fflush = builtin
gensub = builtin
gsub = builtin
index = builtin
int = builtin
isarray = builtin
length = builtin
log = builtin
lshift = builtin
match = builtin
mktime = builtin
or = builtin
patsplit = builtin
rand = builtin
reada = extension
rshift = builtin
sin = builtin
split = builtin
sprintf = builtin
sqrt = builtin
srand = builtin
strftime = builtin
strtonum = builtin
sub = builtin
substr = builtin
system = builtin
systime = builtin
tolower = builtin
toupper = builtin
typeof = builtin
writea = extension
xor = builtin

관련 정보