繁体   English   中英

使用 jq 从 json 数据结构中提取标签

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM