【问题标题】:Multiple filters using JQ使用 JQ 的多个过滤器
【发布时间】:2015-08-26 09:43:27
【问题描述】:

我的老板希望我们的团队使用 JQ 来解析 JSON 文件。我使用的一个应用程序会生成我需要转换的 JSON。我有一个看起来像这样的文件:

{
    "Collections": [
        {
            "OptionGroups": [
                {
                    "OptionGroupName": "Test1",
                    "Status": "in-sync"
                }
            ],
            "Version": "3.4.25",
            "InstanceIdentifier": "Dev1"
        },
        {
            "OptionGroups": [
                {
                    "OptionGroupName": "Test2",
                    "Status": "in-sync"
                }
            ],
            "Version": "3.4.22",
            "InstanceIdentifier": "Dev2"
        }
    ]
}

使用 JQ,当我执行此操作时:

cat json.txt | jq -r '.Collections[].OptionGroups[].OptionGroupName, .Collections[].InstanceIdentifier, .Collections[].Version'

我得到这个输出:

Test1
Test2
Dev1
Dev2
3.4.25
3.4.22

如何获得如下所示的输出:

Test1    Dev1    3.4.25
Test2    Dev2    3.4.22

【问题讨论】:

    标签: json filter jq


    【解决方案1】:

    在使用在单个表达式中使用多个 [] 的过滤器时,请务必谨慎行事。一不小心,可能会得到意想不到的结果。

    我会将其视为转换为 CSV(但使用不同的分隔符,制表符)。

    首先将数据转换为您的行。

    .Collections[] | { InstanceIdentifier, Version } + (.OptionGroups[] | { OptionGroupName })
    

    使用这些新对象,您可以构建行值数组并写出该行。无需将数组传递给@csv 过滤器,只需使用制表符将它们连接起来。

    [ .OptionGroupName, .InstanceIdentifier, .Version ] | join("\t")
    

    【讨论】:

    • 谢谢,这解决了问题,所以我接受了答案。我们使用的是 jq 1.3,所以我不能使用“join”,但 @csv 产生了我可以使用的输出。
    猜你喜欢
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2018-03-13
    • 2022-12-02
    相关资源
    最近更新 更多