jq:限制复数中的所有数组 json
jq: limitting all arrays in a complex json
正在尝试以下代码:
echo '["a","b","c","d","e"]' | jq '..|= if type == "array" then [limit(3;.[])] else . end'
[
"a",
"b",
"c",
null,
null
]
期望它生成短数组:
[
"a",
"b",
"c"
]
我使用的 JSON 又大又复杂。我的目标是将所有数组的长度缩小到 3。我得到的是具有大量空值的原始长度数组。
想法?
如果虽然整体结构可能很复杂,但数组的数量和排列并不复杂(例如,没有数组本身是另一个数组中高于 3 的项等),您可以简单地解决“所有数组”并将它们彼此独立地缩短:
(.. | arrays) |= .[:3]
但是,如果您需要涵盖这些特殊情况,walk
会更合适,因为它按顺序下降文档树,因此不会在截断后留下悬空部分:
walk(if type == "array" then .[:3] else . end)
正在尝试以下代码:
echo '["a","b","c","d","e"]' | jq '..|= if type == "array" then [limit(3;.[])] else . end'
[
"a",
"b",
"c",
null,
null
]
期望它生成短数组:
[
"a",
"b",
"c"
]
我使用的 JSON 又大又复杂。我的目标是将所有数组的长度缩小到 3。我得到的是具有大量空值的原始长度数组。
想法?
如果虽然整体结构可能很复杂,但数组的数量和排列并不复杂(例如,没有数组本身是另一个数组中高于 3 的项等),您可以简单地解决“所有数组”并将它们彼此独立地缩短:
(.. | arrays) |= .[:3]
但是,如果您需要涵盖这些特殊情况,walk
会更合适,因为它按顺序下降文档树,因此不会在截断后留下悬空部分:
walk(if type == "array" then .[:3] else . end)