使用jq范围变量输入新的jq过滤器

时间:2019-04-24 20:21:45

标签: variables pipeline jq

我有一些看起来像这样的JSON:

2017
2015
2013
2012
2010

{ "vertices": [ { "id": 71597, "ns": "ca", "alias": "polarized" }, { "id": 129748, "ns": "av", "name": "Polarized" }, { "id": 129898, "ns": "av", "name": "False" } ], "edgeGroups": { "hasAttributeValue": [ [ 0, 1 ], [ 0, 2 ] ] } } 中的各个条目通过其数组索引相关联。因此,在这种情况下,第一个顶点(id:71597-数组索引为0)具有属性值129748和129898(数组索引分别为1和2)。

我可以使用以下jq过滤器获取要搜索的属性的数组索引:

.vertices

这将返回$ i值0,因为别名为“ polarized”的对象是数组中的第一项。您可以在jq播放上尝试一下:

https://jqplay.org/s/DsHYi7ixyn

现在,我想在不同的过滤器中使用该$ i值,因此与其输出0,不如输出以下结果:

.vertices | range(0;length) as $i | select(.[$i].alias=="polarized" and .[$i].ns=="ca") | $i

我已经尝试过使用管道运算符,但这给我一个错误:

.edgeGroups.hasAttributeValue[] | select(.[0] == 0)

如果我能理解如何在链接的过滤器中使用$ i,我想我可以解决我的主要目标,那就是将多个过滤器链接在一起,以便获得与71597对象关联的所有项目-即< / p>

.vertices | range(0;length) as $i | select(.[$i].alias=="polarized" and .[$i].ns=="ca") | .edgeGroups.hasAttributeValue[] | select(.[0] == $i)

感谢您的任何帮助!

2 个答案:

答案 0 :(得分:3)

您的jq过滤器可以用两个括号固定:

(.vertices
 | range(0;length) as $i
 | select(.[$i].alias=="polarized" and .[$i].ns=="ca")
 | $i) as $i
| .edgeGroups.hasAttributeValue[]
| select(.[0] == $i)

答案 1 :(得分:0)

让我为您提供一个替代解决方案-一种用于JSON的步行路径Unix工具: jtc 。在jtc中,您将查询“编码”到行走路径本身,因此最终目标将如下所示:

bash $ <file.json jtc -w'[vertices][alias]:<polarized>[-1][ns]:<ca>[-1]<idx>k [^0][edgeGroups][hasAttributeValue][:][0]<idx>s[-1][1]<ref>v [^0][vertices]>ref<t'
{
   "id": 129748,
   "name": "Polarized",
   "ns": "av"
}
{
   "id": 129898,
   "name": "False",
   "ns": "av"
}
bash $ 

让我在此处将步行路径(-w)分成几块:

-[vertices][alias]:<polarized>[-1][ns]:<ca>[-1]<idx>k-将在vertices中找到具有"alias": "polarized""ns": "ca"的记录,并将找到的记录的索引存储到命名空间idx(命名空间标题是任意的

-[^0][edgeGroups][hasAttributeValue][:][0]<idx>s[-1][1]<ref>v-将(在所有记录中)找到edgeGroups / hasAttributeValue中的第一个值与存储索引(在命名空间idx中匹配)的那些对象,并将将第二个/相邻值的值存储在名称空间ref中。

-[^0][vertices]>ref<t-返回vertices并通过存储在命名空间ref中的索引(标签)打印记录

披露:我是jtc工具的创建者