【问题标题】:JQ with nested JSON带有嵌套 JSON 的 JQ
【发布时间】:2019-05-07 16:50:29
【问题描述】:

您好,我是 JQ 和一般命令行工具的新手,所以我真的很迷茫。我有一个 JSON 文件,格式为:

{
    "Z": {
        "00": [{
                "e": "A000"
            }, {
                "e": "A020"
            }
        ],
        "01": [{
                "e": "A102"
            }, {
                "e": "C027"
            }
        ]
    },
    "X": {
        "00": [{
                "e": "P002"
            }, {
                "e": "T027"
            }
        ],
        "01": [{
                "e": "A003"
            }, {
                "e": "A020"
            }
        ]
    }
}

其中每个对象都是一个七个字符的字母数字代码。

我正在寻找一个命令来输出由换行符分隔的每个代码,如下所示:

Z00A000
Z00A020
Z01A102
Z01C027
X00P002
X00T027
X01A003
X01A020

尽管名称“Z”和“X”以及子名称“00”“01”等可能会发生变化,因此它们无法硬编码,但 JSON 的格式将始终相同。

如前所述,我是新手,我最接近的是

jq '.[] | .[] | .[] | .e'

这给了我代码的最后四个字符的列表。

老实说,我完全迷失了,所以非常感谢任何帮助。感谢阅读。

【问题讨论】:

    标签: json key jq


    【解决方案1】:

    这是一个基于格式统一性的解决方案。

    首先,让我们定义一个辅助函数来处理 JSON 对象,这些对象的值是 {"e": _} 形式的对象数组:

    def combine:
      keys_unsorted[] as $k
      | $k + (.[$k][]|.e) ;
    

    现在解决方案可以只写两行:

    keys_unsorted[] as $k
    | $k + (.[$k]|combine)
    

    使用 -r 命令行选项将导致在不带引号的情况下发出字符串。

    另一种策略

    以下内容不仅更加通用,而且还说明了一种不同的策略,可以进一步推广和变体:

    paths as $p
    | getpath($p) as $v
    | select($v | type == "string")
    | $p
    | map(select(type=="string"))
    | map(select(. != "e"))
    | . + [$v]
    | join("")
    

    【讨论】:

    • 哇!非常感谢您的回答。我将不得不做一些阅读以了解代码的实际作用。不过它确实有效。
    • 嗨,只是想让你知道,当我在大型 json 文件上运行你的代码时,我有(~192000 个对象)前两段代码列出了超过 200 万个对象而不是 192000 个。第三段策略给出了正确的结果。我正在管道(如果这是正确的术语,即使用>)到一个文本文件,所以我不知道这是否与前两个失败的原因有任何关系。我在 Linux 和 Windows 上都进行了测试,都给出了相似的结果。再次感谢您的帮助。
    • 我看了看,格式好像一样。唯一的区别是,在我的 Z 和 X 下的 OP 示例中,有两个子对象(可能是错误的术语)“00”和“01”,而在大文件中可能有任意数量(> 0)的子对象。它们都是数组,其中所有项目都是 {"e":_} 对象。如果您想自己测试,我可以将文件上传到某个地方。
    • 是的,一定要上传。您也可以尝试使用模式推断工具,例如 gist.github.com/pkoppstein/a5abb4ebef3b0f72a6ed 的工具(免责声明:我写的 :-)
    • [link]drive.google.com/file/d/1Bd3yp6bNTmgYNtDf7kGQUHOMuXUApcX5/… 老实说,我不知道如何使用您链接到的模式推理工具。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多