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

在awk中引用嵌套数组

awk
  •  0
  • Phil  · 技术社区  · 7 年前

    我正在创建一组映射,这些映射可以使用以下3个键编入索引:

    mappings["foo"]["bar"]["blah"][1]=0
    split( "10,13,19,49", mappings["foo"]["bar"]["blah"] )
    

    然后,我可以使用例如

    mappings[product][format][version][i] 
    

    但当我需要多次引用同一嵌套数组时,这有点冗长,因此在其他语言中,我会创建一个对内部数组的引用:

    map=mappings[product][format][version]
    map[i]
    

    我在谷歌上只能找到一个链接,这表明在以前的awk版本中这是不可能的,而循环设置键和值是唯一的解决方案。还是这样,还是有人有更好的解决方案的建议?

    https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/Howawk-ward/Howawk-ward.html

    编辑

    我有一组CSV文件,正在输入AWK。其思想是在对行应用过滤后,基于特定列计算校验和。

    要进行校验和的列以及要应用的筛选都是从发送到脚本中的运行时参数派生的。

    运行时参数是(产品、格式、版本)的三重参数,因此我使用了3嵌套的关联数组。

    另一种方法是使用triple作为单键,而不是嵌套,但gawk似乎并不支持这一点,因此我最终将值作为字符串连接起来。对我来说,这感觉没有那么条理化,但如果我错了,我很高兴在这个问题上改变主意。

    无论如何,正是这些参数被用来索引到数组中,以构建结构来检索列号等。

    mappings["product-foo"]["format-bar"]["version-blah"][1]=0
    split( "10,13,19,49", mappings["product-foo"]["format-bar"]["version-blah"] )
    mappings["product-foo"]["format-moo"]["version-blah"][1]=0
    split( "55,23,14,6", mappings["product-foo"]["format-moo"]["version-blah"] )
    

    神奇之处在于,您可以看到映射索引在没有引用的情况下会变得多么冗长:

        (FNR>1 && (format!="some-format" ||
                  (version=="some-version" && $1=="some-filter")  ||
                  (version=="some-other-version" && $8=="some-other-filter"))) {
               # Loop over each supplied field summing an absolute tally for each
               for (i=1; i <= length(mappings[product][format][version]); i++) {
                   sumarr[i] += ( $mappings[product][format][version][i] < 0 ? -$mappings[product][format][version][i]:$mappings[product][format][version][i] )
               }
        }
    

    1 回复  |  直到 7 年前
        1
  •  0
  •   Phil    7 年前

    正确答案来自上面的@ed morton(谢谢!)。

    埃德-如果你把它写下来作为一个答案,我会接受它,否则我会接受这个报价在几天内良好的管家。

    对,awk中没有数组复制功能,也没有指针/引用,因此无法创建指向数组的指针。当然,您可以创建函数映射(i){返回映射[product][format][version][i]}