簡體   English   中英

用 jq 和 zip 兩個 arrays 解析 json

[英]Parse json with jq and zip two arrays

我有以下 jq 命令,我在其中提取一個字段並創建兩個 arrays

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

正如所料,我得到以下 output:

{
  "hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
  "engine": [
    "A",
    "B",
    "C"
  ],
  "malware": [
    "1",
    "2",
    "3"
  ]
}

現在,我想 zip 兩個 arrays 並保持 rest 到達:

{
  "hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
  "assertions": [
    {
      "engine":  "A",
      "malware": "1"
    },
    {
      "engine":  "B",
      "malware": "2"
    },
    {
      "engine":  "C",
      "malware": "3"
    }]
}

我看到他們使用轉置和 map 的帖子,但我無法讓它工作,因為我想保留其他字段。

您可以使用transpose內置函數,它將 arrays 數組轉換為壓縮數組,並使用map在每個配對數組元素中生成 object。

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

請注意,由於要壓縮的 arrays 都來自同一迭代.assertions[] (以這種方式執行兩次),因此您可以簡單地拉出迭代並使用map使其隱含:

jq '{
  "hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
  "assertions": (
    .assertions
    | map({
        "engine": .engine.name,
        "malware": .metadata.malware_family
      })
  )
}' file.json

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM