gawk5.0からは名前空間が使えるようになりました。行頭に @namespace "識別子" で名前空間を区別することができます。デフォルトでは"awk"です。
10進-16進変換を例として書いてみます。16進→10進変換の関数h2d()、10進→16進変換の関数d2h()、これらに必要な変数や配列の初期化init()、およびデバッグ用のdebug()は名前空間 "hex"にあります。他の名前空間からは hex::h2d()のように呼び出します。変数の参照も同様にhex::D2H[1]のように書けばできます。
ある名前空間内でグローバルに参照する変数はこの例のようにinit()のような関数内で設定することにして、呼び出し元の名前空間(ここではデフォルトの"awk")から一回呼び出してやればよいかと思います。
# gawk -M -f hex.awk # -M は多倍長演算サポート
BEGIN {
hex::init()
# hex::debug()
t="deadbeefdeadbeefdeadbeefdeadbeef" ; print t,hex::h2d(t)
t="142857142857" ; print t,hex::d2h(t)
for(i in hex::D2H) print i,hex::D2H[i]
}
{
print hex::h2d($1)
}
@namespace "hex"
func init() {
a="0123456789ABCDEF"
b="abcdef"
for (i=0; i<=15; i++) {
D2H[i]=substr(a,i+1,1)
H2D[substr(a,i+1,1)]=i
}
for(i=0; i<=5; i++) H2D[substr(b,i+1,1)]=i+10
}
func h2d(h ,sum,m,i,t) {
sum=0
m=1
for (i=length(h); i>=1; i--) {
t=substr(h,i,1)
if (H2D[t]=="") return -1
sum+=H2D[t]*m
m=m*16
}
return sum
}
func d2h(d ,sum,t) {
sum = ""
do {
t=d % 16
sum = D2H[t] sum
d = int(d/16)
} while (d>0)
return sum
}
func debug() {
print "*H2D"
for (i in H2D) print i,H2D[i]
print "*D2H"
for (i in D2H) print i,D2H[i]
}