代码之家  ›  专栏  ›  技术社区  ›  GiM

awk/gawk asorti()问题

  •  2
  • GiM  · 技术社区  · 16 年前

    我对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的doc说(asort(s[,d]):

    “使用gawks比较值的常规规则对s的内容进行排序…”

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

    看起来还可以(使用类似于:

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

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   Dennis Williamson    16 年前

    根据 gawk manual 数组下标总是字符串。 "

        2
  •  3
  •   Vlad    11 年前

    我知道gawk3有一些限制,但在gawk4上(至少在4.1.1上),它是微不足道的:

    t=asorti(a, o, "@ind_num_asc");
    
        3
  •  1
  •   Dimitre Radoulov    16 年前

    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]
        }'
    
    推荐文章