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