![awk에 함수가 정의되어 있는지 테스트하는 방법은 무엇입니까?](https://linux55.com/image/17402/awk%EC%97%90%20%ED%95%A8%EC%88%98%EA%B0%80%20%EC%A0%95%EC%9D%98%EB%90%98%EC%96%B4%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
프로그램 을 작성 awk
중인데 . 정렬 기능이 필요합니다. 나만의 함수를 작성했지만 가능하다면 내장 함수를 사용하고 싶습니다.mawk
gawk
asort()
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()
로 해석됩니다 . 그렇지 않으면 함수가 존재하지 않는다는 오류가 발생합니다 .asort
x
asort()
따라서 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