【问题标题】:JSON file parsing in linux with JQ, select some elements depending on value contained in a specific elementlinux下用JQ解析JSON文件,根据特定元素中包含的值选择一些元素
【发布时间】:2017-05-30 20:38:25
【问题描述】:

我是 jq 的新用户,我很难找到解决问题的好方法。

我有这个示例 json 文件:

{
    "one":"one_value",
    "two": [
        { // sub structure 0
            "aa" : [
                "aa_value_0"
            ],
            "ab" : { ... },
            "ac" : [
                "ac_value_0"
            ] 
        },
        { // sub structure 1
            "aa": [
                "aa_value_1"
            ],
            "ab": {
                "aba": [
                    "aba_value_1"
                ],
                "abb": [
                    "tototatatiti"
                ],
                "abc": [
                    "abc_value_1"
                ]
            },
            "ac": [
                "ac_value_1"
            ]
        },
        { // sub structure 2
            "aa" : ...
            ...
        },
        ...
        { // sub structure x
            "aa" : ...
            ...
        }
    ]
}

我有一个名为“two”的数组,其中包含多个子结构(子结构 0、子结构 1、子结构 2、...、子结构 x)。我想选择 ab.abb 键(在同一子结构中)包含特定单词的 'ac' 和 'aa' 值。 所有子结构都具有相同的结构。

在我的示例中,如果我搜索单词“tata”,我必须获得值“aa_value_1”和“ac_value_1”,因为在子结构“1”中,ab.abb 字段包含单词“tata”(tototatatiti )

我该怎么做? 谢谢:)

【问题讨论】:

    标签: json parsing data-manipulation jq


    【解决方案1】:

    要求在几个方面并不完全清楚,但以下查询与描述匹配并生成它应该生成的两个值,假设示例输入已被修改为有效的 JSON:

    .two[]
    | select( .ab.abb | type == "array")
    | select( .ab.abb[] | test("tata") )
    | [ .ac[],.aa[] ]
    

    (如果.two 与声明的一样常规,则不需要上面的第二行。此外,如果您的jq 没有test/1,那么您可以升级或改用index/1。)

    对于给定的输入,在纠正之后,使用 -c 选项调用 jq 会产生:

    ["ac_value_1","aa_value_1"]
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2021-11-13
      • 2015-07-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2016-12-12
      • 1970-01-01
      相关资源
      最近更新 更多