首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用jq和zip两个数组解析json

用jq和zip两个数组解析json
EN

Stack Overflow用户
提问于 2022-01-24 09:59:37
回答 1查看 215关注 0票数 0

我有以下jq命令,其中提取一个字段并创建两个数组

代码语言:javascript
复制
jq '{
"hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
"engine": [.assertions[] | .engine.name],
"malware": [.assertions[] | .metadata.malware_family]
}' file.json

正如预期的那样,我得到了以下输出:

代码语言:javascript
复制
{
  "hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
  "engine": [
    "A",
    "B",
    "C"
  ],
  "malware": [
    "1",
    "2",
    "3"
  ]
}

现在,我想压缩这两个数组,并将其余的压缩到:

代码语言:javascript
复制
{
  "hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
  "assertions": [
    {
      "engine":  "A",
      "malware": "1"
    },
    {
      "engine":  "B",
      "malware": "2"
    },
    {
      "engine":  "C",
      "malware": "3"
    }]
}

我看到一个帖子,他们使用转置和地图,但我无法使它工作,因为我想保留其他领域。

EN

回答 1

Stack Overflow用户

发布于 2022-01-24 10:07:46

您可以使用transpose内置(它将数组数组转换为压缩数组)和map在每个配对数组元素中生成一个对象。

代码语言:javascript
复制
jq '{
  "hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
  "assertions": (
    [
      [.assertions[] | .engine.name],
      [.assertions[] | .metadata.malware_family]
    ]
    | transpose
    | map({"engine": .[0], "malware": .[1]})
  )
}' file.json

请注意,由于要压缩的两个数组都来自同一个迭代.assertions[] (以这种方式执行两次),您可以简单地提取迭代,并使用map将其隐式化。

代码语言:javascript
复制
jq '{
  "hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
  "assertions": (
    .assertions
    | map({
        "engine": .engine.name,
        "malware": .metadata.malware_family
      })
  )
}' file.json
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70831992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档