我对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]
    }'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top