我有一些看起来像这样的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)
感谢您的任何帮助!
答案 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
工具的创建者