你好,我是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'
其中列出了代码的最后四个字符。
说实话,我完全迷失了,所以对您的帮助将不胜感激。感谢您的阅读。
答案 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("")