使用 ./jq 按值过滤
Filter by values using ./jq
给定尺码输入:
[
{
"stock": 1,
"sales": 0,
"sizes": [
{
"countries": ["at", "be", "ch", "cy", "de", "ee", "es", "fi", "gr", "ie", "lu", "lv", "nl", "pl", "pt", "se", "si", "sk"],
"size": "EU 45,5"
},
{
"countries": ["it"],
"size": "EU 45,5"
},
{
"countries": ["fr"],
"size": "EU 45,5"
},
{
"countries": ["gb"],
"size": "EU 45,5"
}
]
}
]
我想获得相同的结构,但没有 countries
没有 "de"(德国)的结构,并删除完整的字段。预期是这样的:
[
{
"stock": 1,
"sizes": [
{
"size": "EU 45,5"
}
]
}
]
我试过这个:
map(.sizes[] |= select(.countries | join(",") | contains("de"))) | map({ stock, sizes })
但是过滤器没有正常工作,抛出jq: error (at <stdin>:48): Cannot iterate over null (null)
。
尝试了 has
、in
、contains
、inside
,但似乎没有任何效果。
另外,如何过滤出现的字段? map({ stock, sizes })
个国家仍然存在。我可以做类似 map({ stock, sizes: { size } })
的事情吗?
这是一个可以回答您的主要问题的单行代码——如果您看不到它是如何工作的,请尝试将其分解成单独的部分:
map( .sizes |= map( select(.countries | index("de") ) | del(.countries) ))
关于字段的选择,你可以像上面那样使用del/1,或者有时简单地使用{key1, key2}
这样的表达式就可以了。还请考虑此函数和以下示例:
def query(queryobject):
with_entries( select( .key as $key | queryobject | has( $key ) ));
示例:
$ jq -c -n '{"a": 1, "b": null, "c":3} | query( {a,b,d} )'
{"a":1,"b":null}
给定尺码输入:
[
{
"stock": 1,
"sales": 0,
"sizes": [
{
"countries": ["at", "be", "ch", "cy", "de", "ee", "es", "fi", "gr", "ie", "lu", "lv", "nl", "pl", "pt", "se", "si", "sk"],
"size": "EU 45,5"
},
{
"countries": ["it"],
"size": "EU 45,5"
},
{
"countries": ["fr"],
"size": "EU 45,5"
},
{
"countries": ["gb"],
"size": "EU 45,5"
}
]
}
]
我想获得相同的结构,但没有 countries
没有 "de"(德国)的结构,并删除完整的字段。预期是这样的:
[
{
"stock": 1,
"sizes": [
{
"size": "EU 45,5"
}
]
}
]
我试过这个:
map(.sizes[] |= select(.countries | join(",") | contains("de"))) | map({ stock, sizes })
但是过滤器没有正常工作,抛出jq: error (at <stdin>:48): Cannot iterate over null (null)
。
尝试了 has
、in
、contains
、inside
,但似乎没有任何效果。
另外,如何过滤出现的字段? map({ stock, sizes })
个国家仍然存在。我可以做类似 map({ stock, sizes: { size } })
的事情吗?
这是一个可以回答您的主要问题的单行代码——如果您看不到它是如何工作的,请尝试将其分解成单独的部分:
map( .sizes |= map( select(.countries | index("de") ) | del(.countries) ))
关于字段的选择,你可以像上面那样使用del/1,或者有时简单地使用{key1, key2}
这样的表达式就可以了。还请考虑此函数和以下示例:
def query(queryobject):
with_entries( select( .key as $key | queryobject | has( $key ) ));
示例:
$ jq -c -n '{"a": 1, "b": null, "c":3} | query( {a,b,d} )'
{"a":1,"b":null}