Jam*_*own 5 arrays sorting awk gawk multidimensional-array
我试图滥用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
Run Code Online (Sandbox Code Playgroud)
但有没有办法使用多维数组作为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\nBEGIN {\n split("first;second;third",src,/;/) # make src array for testing\n\n asort(src, dest1d) # copy array to dest1d\n for(i in dest1d)\n print i, src[i], dest1d[i] # output\n print ""\n\n dest2d[src[1]][1]\n asort(src, dest2d[src[1]]) # copy array to dest2d\n for(i in dest2d)\n for (j in dest2d[i])\n print i, j, dest2d[i][j] # output\n}\n\n$ gawk -f tst.awk\n1 first first\n2 second second\n3 third third\n\nfirst 1 first\nfirst 2 second\nfirst 3 third\nRun Code Online (Sandbox Code Playgroud)\n\n为初始子数组指定什么索引并不重要,因为它会被 asort() 删除。请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays下的最后一个示例:
\n\n\n\n回想一下,对未初始化数组元素的引用会产生\n 值“”,即空字符串。当您打算使用子数组作为函数的参数时,这有一个重要的含义,如以下示例所示:
\n\nRun Code Online (Sandbox Code Playgroud)\n\n$ gawk \'BEGIN { split("a b c d", b[1]); print b[1][1] }\'\nerror\xe2\x86\x92 gawk: cmd. line:1: fatal: split: second argument is not an array\n解决此问题的方法是首先通过创建任意索引来强制 b[1] 为数组:
\n\nRun Code Online (Sandbox Code Playgroud)\n$ gawk \'BEGIN { b[1][1] = ""; split("a b c d", b[1]); print b[1][1] }\'\n-| a\n