jq 选择在嵌套 json bash 中具有特定值的对象

Ele*_*nor 5 bash json jq

这是我的 json.

[
 {
  "time": "2017-06-10 00:00:48-0400,317",
  "UserInfo": {
    "AppId": "ONE_SEARCH",
    "UsageGroupId": "92600",
   },
  "Items": [
    {
     "PublicationCode": "",
     "OpenUrlRefId": "",
     "ReferringUrl": "N",
     "OpenAccess": "0",
     "ItmId": "1328515516"
    }
   ]
 },
 {
  "time": "2017-06-10 00:00:48-0400,548",
  "UserInfo": {
    "AppId": "DIALOG",
    "UsageGroupId": "1195735",
  },
  "Items": [
    {
     "Origin": "Alert",
     "PublicationCode": "",
     "NumberOfCopies": 1,
     "ItmId": "1907446549"
    },
    {
     "Origin": "Alert",
     "PublicationCode": "",
     "NumberOfCopies": 1,
     "ItmId": "1907446950",
    }
  ]
 }
]
Run Code Online (Sandbox Code Playgroud)

我想使用 jq 提取其元素“Items”中具有“Origin”:“Alert”的对象。结果应该是这样的:

{
 "time": "2017-06-10 00:00:48-0400,548",
 "UserInfo": {
   "AppId": "DIALOG",
   "UsageGroupId": "1195735",
},
 "Items": [
   {
    "Origin": "Alert",
    "PublicationCode": "",
    "NumberOfCopies": 1,
    "ItmId": "1907446549"
   },
   {
    "Origin": "Alert",
    "PublicationCode": "",
    "NumberOfCopies": 1,
    "ItmId": "1907446950",
   }
 ]
}
Run Code Online (Sandbox Code Playgroud)

或这个:

{
 "Items": [
    {
     "Origin": "Alert",
     "PublicationCode": "",
     "NumberOfCopies": 1,
     "ItmId": "1907446549",
     "ReasonCode": ""
    },
    {
     "Origin": "Alert",
     "PublicationCode": "",
     "NumberOfCopies": 1,
     "ItmId": "1907446950",
    }
 ]
}
Run Code Online (Sandbox Code Playgroud)

如何使用jq来做到这一点?我尝试了多种方法,但大多数方法只会返回一个包含所有子对象的数组,其中包含“Origin”:“Alert”。我需要这些子对象仍然保持结构,因为我需要知道它们中的哪些一起发生,哪些单独发生。

顺便说一句,“Origin”的唯一值是“Alert”。因此,如果您有任何方法可以选择具有给定键名称的对象,它也应该有效。

谢谢你!:)

pea*_*eak 5

过滤器:

.[] | select( any(.Items[]; .Origin == "Alert"))
Run Code Online (Sandbox Code Playgroud)

产生第一个提到的可接受的结果。如果你的jq没有any/2那么我建议升级。如果这不是一个选项,那么您可以使用以下简单但效率低下的过滤器:

.[] | select( .Items | map(.Origin) | index("Alert"))
Run Code Online (Sandbox Code Playgroud)

或者:

.[] | select(reduce .Items[] as $item (false; . or ($item | .Origin == "Alert")))
Run Code Online (Sandbox Code Playgroud)