使用jq

时间:2019-04-29 02:43:59

标签: json jq

假设我在jq命令中输入了以下json:

[
  {"type":"dog",  "set":"foo"},
  {"type":"bird", "set":"bar"},
  {"type":"cat",  "set":"blaz"},
  {"type":"fish", "set":"mor"}
]

我知道此数组中有一个元素,其type是“ bird”,在这种情况下是第二个元素。但是我想要它的下一个(或上一个)同级,即它之后(之前)的元素,在这种情况下,是第三个(第一个)元素。如何在jq中获得它?

另外,我还有另一个问题:如果匹配的元素(即我知道的type值的元素)是数组中的最后一个元素,我希望它获得下一个第一个(也就是说,循环遍历数组)而不返回任何内容。无论匹配的元素是第一个元素(然后我想获取最后一个元素),都是相同的。

2 个答案:

答案 0 :(得分:1)

为特定起见,让我们假设您要提取<script src="/socket.io/socket.io.js"></script> <script src="http://code.jquery.com/jquery-1.11.1.js"></script> <script> var socket = io('ws://127.0.0.1:3000'); socket.emit('ui:index:loaded',{_id: '123456'}); socket.on('app:banner:loaded',function(obj){ console.log(obj); }); socket.on('app:collection:loaded',function(obj){ console.log(obj); }); </script> 三元组作为数组,其中(before, focus, after)before如前所述。为简单起见,我们还假设源数组的长度至少为2。

接下来,为了便于说明和理解,我们将定义一个辅助函数来提取以下三个项目:

after

现在我们只需要找到索引并使用它即可:

# $i is assumed to be a valid index into the input array,
# which is assumed to be of length at least 2
def triple($i):
  if $i == 0 then [last] + .[0:2]
  elif $i == (length-1) then .[$i-1: $i+2] + [first]
  else .[$i-1: $i+2]
  end;

使用这种方法,可以轻松获得其他变体。

答案 1 :(得分:1)

让我还为您提供一种替代解决方案,基于JSON的步行路径Unix工具: jtc -您可以在其中将查询逻辑“编码”到路径中:< / p>

例如找到"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 }}

平均一次可以选择下一个兄弟姐妹:

-1

或者,选择第一个条目(基于最后一个匹配项):

bash $ <file.json jtc -w'[type]:<bird>[-1]<idx>k[-1]>idx<t1'
{ "set": "blaz", "type": "cat" }

(只需放一些肯定较低的值作为相对量-它将标准化为第一个条目)

PS>披露:我是bash $ <file.json jtc -w'[type]:<fish>[-1]<idx>k[-1]>idx<t-1000' -r { "set": "foo", "type": "dog" } 工具的创建者