尴尬 / gawk asorti()问题
-
28-09-2019 - |
题
我对Gawk的Asorti函数有以下问题:
gawk 'BEGIN{ \
a[1]=6; \
a[2]=7; \
a[3]=8; \
a[21]=9; \
a[123]=10; \
t=asorti(a, o); \
for (i=1; i<=t; i++) { \
print i,o[i]; \
} \
}'
结果是:
1 1
2 123
3 2
4 21
5 3
因此,很明显尴尬,按词典顺序排序的索引,但是Awk的Doc说(Asort(s [,d])):
“ S的内容是使用Gawk的正常规则来分类的,以比较值...''
但是,当我将索引本身复制到temp数组中,然后使用ASORT()对新数组进行排序,
似乎还可以(使用类似):
j=1; for(e in a) { temp[j++] = e; }
我是在做 - 还是Gawk的Asorti()有问题?
解决方案
根据 Gawk手册: :“关于阵列要记住的一个重要方面是 数组下标总是字符串。"
其他提示
我知道Gawk 3存在局限性,但是在Gawk 4(至少在4.1.1上)这很微不足道:
t=asorti(a, o, "@ind_num_asc");
作为解决方法,您可以使用类似的东西(您可能需要调整填充):
gawk 'BEGIN {
a[1] = 6; a[2] = 7; a[3] = 8; a[21] = 9; a[123] = 10;
for (i in a) io[sprintf("%15s", i)] = a[i]
t = asorti(io, o)
for (i = 0; ++i <= t;) print i, o[i] + 0
}'
使用GNU尴尬,您甚至可以保留原始键/索引:
WHINY_USERS=oops gawk 'BEGIN {
a[1]=6; a[2]=7; a[3]=8; a[21]=9; a[123]=10;
for (i in a) o[sprintf("%15s", i)] = a[i]
for (i in o) print i + 0, o[i]
}'
不隶属于 StackOverflow