Json 在查询其子节点时返回带有jq的父节点

Json 在查询其子节点时返回带有jq的父节点,json,bash,shell,unix,jq,Json,Bash,Shell,Unix,Jq,想知道在查询子“Id”时是否可以从下面的json返回父“Id” 如果我查询子id“abc”,它应该返回“parent123” 做一些类似于: more jsonfile | jq '.DistributionList.Items[].Origins.Items[] | select(.Id == "abc") | .Id' 将只返回“abc”->但我需要父id。 不确定是否有办法使用jq执行此操作过滤器: .. | 对象|选择(.Origins.Items[]?|.Id==“abc”)|.Id

想知道在查询子“Id”时是否可以从下面的json返回父“Id”

如果我查询子id“abc”,它应该返回“parent123”

做一些类似于:

more jsonfile | jq '.DistributionList.Items[].Origins.Items[] | select(.Id == "abc") | .Id'
将只返回“abc”->但我需要父id。 不确定是否有办法使用jq执行此操作过滤器: .. | 对象|选择(.Origins.Items[]?|.Id==“abc”)|.Id

产生:

"parent123"
您可能希望参数化过滤器,例如:

def parent(child):
 .. | objects | select( .Origins.Items[]? | .Id == child) | .Id ;

原始问题中的过滤器接近解决方案。只需重新排列
选择中的内容即可。例如

  .DistributionList.Items[]
| select(.Origins.Items[].Id == "abc")
| .Id

如果不使用jq,像这样的东西怎么样:
grep-oP'(?@ritesht93我只是在我的mac下用这个命令得到一个grep使用帮助文本
more filename | jq'.| objects | select(.origines.Items[]?|.Id==“xxx”)|.Id'
完成了这个技巧,谢谢。
  .DistributionList.Items[]
| select(.Origins.Items[].Id == "abc")
| .Id