JSON 使用 JQ 在 linux 中解析文件,select 某些元素取决于特定元素中包含的值

JSON file parsing in linux with JQ, select some elements depending on value contained in a specific element

我是一个新的 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)。我想要 select 'ac' 和 'aa' 值,其中 ab.abb 键(在同一子结构中)包含一个特定的词。 所有子结构都具有相同的结构。

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

我该怎么做? 谢谢 :)

要求在几个方面并不完全清楚,但以下查询与描述相匹配并产生它应该的两个值,假设示例输入已被修改为有效 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"]