3

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,按字典顺序排序索引,但是awk的文档说(asort(s [,d])):

“ s 的内容使用 gawk 比较值的常规规则进行排序......”

但是,当我将索引本身复制到临时数组中,并使用 asort() 对该新数组进行排序时,

看起来没问题(使用类似的东西):

j=1; for(e in a) { temp[j++] = e; }

我做错了,还是 gawk 的 asorti() 有问题?

4

3 回答 3

3

根据gawk 手册:“关于数组要记住的一个重要方面是数组下标始终是字符串。

于 2010-06-21T18:25:55.900 回答
3

我知道 gawk 3 有限制,但在 gawk 4(至少在 4.1.1 上)它是微不足道的:

t=asorti(a, o, "@ind_num_asc");
于 2015-04-25T00:13:01.877 回答
1

作为一种解决方法,您可以使用类似这样的方法(您可能需要调整填充):

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 awk,您甚至可以保留原始键/索引:

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]
    }'
于 2010-06-22T09:16:08.903 回答