以下是额外的澄清
对于输入对象 {"key1":1, "key2":2, "key3":3}
,我希望删除所有不在所需键集合 ["key1","key3","key4"]
中的键。
jq -n --argjson desired_keys '["key1","key3","key4"]' \
--argjson input '{"key1":1, "key2":2, "key3":3}' \
' $input
| with_entries(
select(
.key == ($desired_keys[])
)
)'
with_entries
将 {"key1":1, "key2":2, "key3":3}
转换成以下的键-值对数组,并将 select 语句应用于数组,然后将结果数组转换回对象。
这是 with_entries
语句中的内部对象。
[
{
"key": "key1",
"value": 1
},
{
"key": "key2",
"value": 2
},
{
"key": "key3",
"value": 3
}
]
我们可以从这个数组中选择符合我们标准的键。这就是魔法发生的地方......以下是命令中间正在进行的操作。下面的命令将扩展的值数组转换为对象列表,我们可以从中选择。
jq -cn '{"key":"key1","value":1}, {"key":"key2","value":2}, {"key":"key3","value":3}
| select(.key == ("key1", "key3", "key4"))'
这将产生以下结果。
{"key":"key1","value":1}
{"key":"key3","value":3}
with entries命令可能有一点棘手,但很容易记住它需要一个过滤器,定义如下:
def with_entries(f): to_entries|map(f)|from_entries;
这与之前的内容相同。
def with_entries(f): [to_entries[] | f] | from_entries;
有时人们会对等号右侧的多个匹配项感到困惑。
考虑以下命令。我们可以看到输出结果是左侧列表和右侧列表的外积。
jq -cn '1,2,3| . == (1,1,3)'
true
true
false
false
false
false
false
false
true
如果该谓词出现在一个select语句中,当该谓词为真时,我们保留输入。请注意,您也可以在此处复制输入。
jq -cn '1,2,3| select(. == (1,1,3))'
1
1
3
select(.key == ("1","3","4"))
在 == 语句的 rhs 上使用 ( )。 - Jon