假设我向jq命令输入了以下json:
[
{"type":"dog", "set":"foo"},
{"type":"bird", "set":"bar"},
{"type":"cat", "set":"blaz"},
{"type":"fish", "set":"mor"}
]
我知道此数组中有一个元素type
为“ bird”,在这种情况下为第二个元素。但是我想要它的下一个(或上一个)同级,即它之后(之前)的元素,在这种情况下,是第三个(第一个)元素。如何在jq中获得它?
另外,我还有一个问题:如果匹配的元素(即type
我知道其值的元素)是数组中的最后一个元素,我希望它获得下一个第一个元素(即循环遍历数组)而不返回任何东西。无论匹配的元素是第一个元素(然后我想获取最后一个元素),都相同。
让我也为您提供一种替代解决方案,该解决方案基于JSON的步行路径unix工具:jtc
-您可以在其中将查询逻辑“编码”到路径中:
例如找到一条"type":"bird"
记录,然后在同级对象之前(在父级数组中)将是这样的:
bash $ <file.json jtc -w'[type]:<bird> [-1]<idx>k [-1]>idx<t-1' -r
{ "set": "foo", "type": "dog" }
让我为您分解一下:
[type]:<bird>
-将递归查找记录 "type":"bird"
[-1]<idx>k
-将在JSON树中提升1层(选择父级,有效选择整个记录{"type":"bird", "set":"bar"}
),并将其数组索引存储到名称空间中idx
[-1]>idx<t-1
-将再次在JSON中提高1级(选择顶部数组),并(以递归方式)搜索索引(存储在中idx
)偏移了的条目-1
同样可以选择下一个同级:
bash $ <file.json jtc -w'[type]:<bird>[-1]<idx>k[-1]>idx<t1'
{ "set": "blaz", "type": "cat" }
或者,选择第一个条目(基于最后一个匹配项):
bash $ <file.json jtc -w'[type]:<fish>[-1]<idx>k[-1]>idx<t-1000' -r
{ "set": "foo", "type": "dog" }
(只要放一些肯定较低的值作为相对量-它将标准化为第一个条目)
PS>披露:我是该jtc
工具的创建者
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句