我有以下jq命令,其中提取一个字段并创建两个数组
jq '{
"hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
"engine": [.assertions[] | .engine.name],
"malware": [.assertions[] | .metadata.malware_family]
}' file.json正如预期的那样,我得到了以下输出:
{
"hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
"engine": [
"A",
"B",
"C"
],
"malware": [
"1",
"2",
"3"
]
}现在,我想压缩这两个数组,并将其余的压缩到:
{
"hash_md5": "799c748fe5fbc1900594d6d79bb9f803",
"assertions": [
{
"engine": "A",
"malware": "1"
},
{
"engine": "B",
"malware": "2"
},
{
"engine": "C",
"malware": "3"
}]
}我看到一个帖子,他们使用转置和地图,但我无法使它工作,因为我想保留其他领域。
发布于 2022-01-24 10:07:46
您可以使用transpose内置(它将数组数组转换为压缩数组)和map在每个配对数组元素中生成一个对象。
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将其隐式化。
jq '{
"hash_md5": .metadata[] | select(.tool == "hash") | .tool_metadata.md5,
"assertions": (
.assertions
| map({
"engine": .engine.name,
"malware": .metadata.malware_family
})
)
}' file.jsonhttps://stackoverflow.com/questions/70831992
复制相似问题