【问题标题】:How does sorting for arrays of arrays differ to multidimensional arrays in awk?数组数组的排序与 awk 中的多维数组有何不同?
【发布时间】:2020-03-26 22:26:23
【问题描述】:

我已经解决了列出一组项目的问题,这些项目具有组件,而这些组件又在 awk 中具有属性。

我尝试通过两种方式解决这个问题。

1) 定义一个数组list[item-number,component-number][properties].
2)定义一个数组list[item-number][component-number][properties].

这在很多方面都很有趣,因为我注意到 (2) 保持插入顺序,而 (1) 没有。我知道数组在 awk 中是关联的,这很可能是巧合。但是,由于插入顺序对我来说很重要(而且,我想了解更多关于 awk 的信息),我想知道这是否会发生以及为什么会发生这种情况。

有什么想法吗? BR 帕特里克

【问题讨论】:

    标签: awk


    【解决方案1】:

    这两种方法都不会保留有关插入顺序的任何信息,如果看起来两者都保留,那只是巧合。如果插入顺序对您很重要,那么您需要编写一些代码来跟踪该顺序,例如

    key = foo FS bar
    if ( !(key in list) ) {
        keys[++numKeys] = key
    }
    list[key] = whatever
    

    将为您提供一个数组keys[](按插入顺序排列的索引)和一个数组list[],将每个键映射到它的值,以便您以后可以这样做:

    for (keyNr=1; keyNr<=numKeys; keyNr++) {
        key = keys[keyNr]
        print list[key]
    }
    

    或类似以插入的顺序打印list[] 的内容。

    【讨论】:

    • 我想我会尝试使用这种方法来处理订单。不幸的是,这似乎使 awk 的致命弱点。感谢您的提示!
    • 亲爱的 Ed,为什么你更喜欢 FS 而不是 SUBSEP
    • @patrik 不客气,但这根本不是阿喀琉斯之踵。当很少有应用程序需要它并且编写代码来支持如果/当你确实需要它时,为什么要跟踪插入顺序并为每个人使用时间和内存。 awk 是一种执行速度极快的小型语言(通常比等效的 C 程序快),因为它的理念是只提供语言结构来完成现有结构难以做到的事情,而这并不难做到。所以这是一个“专业”,而不是一个“骗子”。
    • @kvantour 因为虽然不太可能,但 SUBSEP 可以出现在您的输入字段中,而默认 FS 不能。键入的字符也更短,当您想要打印数组索引时,空白或其他字符串比 SUBSEP 更容易看到。如果您对 FS 使用正则表达式,那么等式会发生变化,然后我会考虑使用 OFS 与 SUBSEP。
    • 另外需要提一下,如果密钥是由浮点数生成的,你可能需要调整CONVFMT
    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2021-09-04
    • 2018-07-11
    • 2020-09-22
    • 2019-04-02
    • 2016-05-12
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多