jq:将查找键作为字段包含在结果值中
jq: Include the lookup key as a field in the result value
我有一个以下形式的 JSON 对象:
{
"vars": {
"node1": {"field1": "a", "field2": "b"},
"node2": {"field1": "x", "field2": "y"}
"unrelated": {"blah": "blah"}
},
"nodes": ["node1", "node2"]
}
现在,我可以使用以下 jq
表达式获取每个节点的字段(不包括 unrelated
):
.vars[.nodes[]]
输出:
{
"field1": "a",
"field2": "b"
}
{
"field1": "x",
"field2": "y"
}
我的问题是,如何将 vars
键作为字段包含在输出中,即
{
"node": "node1",
"field1": "a",
"field2": "b"
}
{
"node": "node2",
"field1": "x",
"field2": "y"
}
密钥的名称(示例中的node
)并不重要。
基于this post我找到了一个近似解:
.vars | to_entries | map_values(.value + {node: .key})[]
输出
{
"field1": "a",
"field2": "b",
"node": "node1"
}
{
"field1": "x",
"field2": "y",
"node": "node2"
}
{
"blah": "blah",
"node": "unrelated"
}
但它仍然包含不应该包含的无关字段。
将nodes
数组的元素存储在变量中以供参考。自动存储元素而不是整个数组也会为下一步进行迭代。然后,只需使用 nodes
数组项作为对象 {$node}
添加到 .vars[$node]
.
中的 looked-up 对象来组成您想要的输出对象
jq '.nodes[] as $node | {$node} + .vars[$node]'
{
"node": "node1",
"field1": "a",
"field2": "b"
}
{
"node": "node2",
"field1": "x",
"field2": "y"
}
我有一个以下形式的 JSON 对象:
{
"vars": {
"node1": {"field1": "a", "field2": "b"},
"node2": {"field1": "x", "field2": "y"}
"unrelated": {"blah": "blah"}
},
"nodes": ["node1", "node2"]
}
现在,我可以使用以下 jq
表达式获取每个节点的字段(不包括 unrelated
):
.vars[.nodes[]]
输出:
{
"field1": "a",
"field2": "b"
}
{
"field1": "x",
"field2": "y"
}
我的问题是,如何将 vars
键作为字段包含在输出中,即
{
"node": "node1",
"field1": "a",
"field2": "b"
}
{
"node": "node2",
"field1": "x",
"field2": "y"
}
密钥的名称(示例中的node
)并不重要。
基于this post我找到了一个近似解:
.vars | to_entries | map_values(.value + {node: .key})[]
输出
{
"field1": "a",
"field2": "b",
"node": "node1"
}
{
"field1": "x",
"field2": "y",
"node": "node2"
}
{
"blah": "blah",
"node": "unrelated"
}
但它仍然包含不应该包含的无关字段。
将nodes
数组的元素存储在变量中以供参考。自动存储元素而不是整个数组也会为下一步进行迭代。然后,只需使用 nodes
数组项作为对象 {$node}
添加到 .vars[$node]
.
jq '.nodes[] as $node | {$node} + .vars[$node]'
{
"node": "node1",
"field1": "a",
"field2": "b"
}
{
"node": "node2",
"field1": "x",
"field2": "y"
}