[英]Extract tags from json datastructures using jq
我有多个 JSON 文件,如下所示:
{
"object1": {
"tags": ["A"],
"something": "else",
"other": "data"
},
"object2": {
"tags": ["A", "B"]
}
}
和
{
"object3": {
"tags": ["C"],
"something": "else",
"other": "data"
},
"object4": {
"tags": ["A"]
}
}
保证所有对象( object1
- object4
)的键在所有文件中都是唯一的。
我需要生成一个不同的 json 文件,这将是一个已用tag
的数组,每个标签都有额外的信息, object
使用它:
[
{
"tag": "A",
"objects": ["object1", "object2", "object4"]
},
{
"tag": "B",
"objects": ["object2"]
},
{
"tag": "C",
"objects": ["object3"]
}
]
此 output 数组中的标签顺序无关紧要。
到目前为止,我有: cat *.json | jq -s add | jq '[.[].tags[]] | unique'
cat *.json | jq -s add | jq '[.[].tags[]] | unique'
cat *.json | jq -s add | jq '[.[].tags[]] | unique'
它为我提供了所有文件中使用的标签数组,但我不太清楚如何获取这些标签的object
列表。 我怀疑这不是一个正确的方法,因为我在这个转换过程中丢失了一些信息(标签的来源)。
任何有关jq
表达式的帮助将不胜感激。 谢谢你。
一种方法是使用to_entries
reduce
输入
jq -s '
add | reduce to_entries[] as $e ({}; .[$e.value.tags[]] += [$e.key])
' *.json
这会给你一个这样的结构
{
"A": [
"object1",
"object2",
"object4"
],
"B": [
"object2"
],
"C": [
"object3"
]
}
然后将其转换为您想要的结构, append 另一个to_entries
jq -s '
add | reduce to_entries[] as $e ({}; .[$e.value.tags[]] += [$e.key])
| to_entries | map({tag:.key, objects:.value})
' *.json
[
{
"tag": "A",
"objects": [
"object1",
"object2",
"object4"
]
},
{
"tag": "B",
"objects": [
"object2"
]
},
{
"tag": "C",
"objects": [
"object3"
]
}
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.