带有嵌套JSON的JQ

时间:2018-12-06 02:39:25

标签: json key jq

你好,我是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'

其中列出了代码的最后四个字符。

说实话,我完全迷失了,所以对您的帮助将不胜感激。感谢您的阅读。

1 个答案:

答案 0 :(得分:0)

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

首先,让我们定义一个辅助函数,该函数处理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("")