将(src,dest)排序到多维数组



我试图滥用asort()(只是因为)复制数组src到数组dest,没有问题:

$ awk 'BEGIN {
    split("first;second;third",src,";") # make src array for testing
    asort(src, dest, "@ind_num_asc")    # copy array to dest
    for(i in dest) 
        print i, src[i], dest[i]        # output
}'
1 first first
2 second second
3 third third

但是有一种方法使用多维数组作为dest数组吗?比如:

asort(src, dest[src[1]], "@ind_num_asc") # or dest[src[1]][]

(前者产生second argument not an array,后者产生syntax error)实际上,split的第一个参数是$0,我正试图对记录进行分组。

当然我可以使用for循环,但我的大脑停留在测试这个解决方案

您只需要首先在dest[src[1]]下创建一个数组,以便gawk知道dest[src[1]]是数组的数组,而不是默认的字符串数组:

$ cat tst.awk
BEGIN {
    split("first;second;third",src,/;/) # make src array for testing
    asort(src, dest1d)              # copy array to dest1d
    for(i in dest1d)
        print i, src[i], dest1d[i]      # output
    print ""
    dest2d[src[1]][1]
    asort(src, dest2d[src[1]])          # copy array to dest2d
    for(i in dest2d)
        for (j in dest2d[i])
            print i, j, dest2d[i][j]    # output
}
$ gawk -f tst.awk
1 first first
2 second second
3 third third
first 1 first
first 2 second
first 3 third

不管你给初始子数组的索引是什么,因为它会被sort()删除。参见https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays:

下面的最后一个例子

回忆一下,对未初始化数组元素的引用将产生a空字符串"的值。这有一个重要的含义您打算使用子数组作为函数的参数,如用下面的例子说明:

$ gawk 'BEGIN { split("a b c d", b[1]); print b[1][1] }'
error→ gawk: cmd. line:1: fatal: split: second argument is not an array

解决这个问题的方法是首先强制b[1]为数组by创建任意索引:

$ gawk 'BEGIN { b[1][1] = ""; split("a b c d", b[1]); print b[1][1] }'
-| a

相关内容

  • 没有找到相关文章

最新更新