如果多个键具有指定值,则使用 jq return 布尔值
use jq to return a boolean if more than one key has a specified value
我有一个 JSON 斑点。它包含要处理的项目队列。我正在使用 jq 来过滤它。此队列中的每个对象都有键 downloadId
。我可以 return 对象列表,其中 downloadId
具有此过滤器的特定值:
.[] | select((.downloadId) == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但我真正需要的是一个布尔值,如果队列中有多个对象具有 downloadId
的值,它将 return true
。我一直在查看 jq 手册,但我不太确定该怎么做。我可以尝试使用 any
any(.[]; .downloadId == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但是如果该值只有一个实例,则 return 为真。
这是一个 blob:
[
{
"sizeleft": 805679928.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370856Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "1C2DE46A5B4258BE7AC47FEFAE71432897417126",
"id": 1065601863
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "728084A13FD172FED437C6AE503A8CF4A8D317AE",
"id": 1177597916
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47",
"id": 1177597916
}
]
为了实现高效的解决方案,让我们定义 repeated/2
来检查给定值是否在流中出现多次:
def repeated(stream; $value):
label $done
| foreach stream as $x (0;
if $x == $value then . + 1 else . end;
if . == 2 then true, break $done else empty end)
// false;
这里的关键当然是在第二次遇到该值时跳出循环。
解决方案
根据以上内容,解决方案是:
repeated(.[] | .downloadId; "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
我有一个 JSON 斑点。它包含要处理的项目队列。我正在使用 jq 来过滤它。此队列中的每个对象都有键 downloadId
。我可以 return 对象列表,其中 downloadId
具有此过滤器的特定值:
.[] | select((.downloadId) == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但我真正需要的是一个布尔值,如果队列中有多个对象具有 downloadId
的值,它将 return true
。我一直在查看 jq 手册,但我不太确定该怎么做。我可以尝试使用 any
any(.[]; .downloadId == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但是如果该值只有一个实例,则 return 为真。
这是一个 blob:
[
{
"sizeleft": 805679928.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370856Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "1C2DE46A5B4258BE7AC47FEFAE71432897417126",
"id": 1065601863
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "728084A13FD172FED437C6AE503A8CF4A8D317AE",
"id": 1177597916
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47",
"id": 1177597916
}
]
为了实现高效的解决方案,让我们定义 repeated/2
来检查给定值是否在流中出现多次:
def repeated(stream; $value):
label $done
| foreach stream as $x (0;
if $x == $value then . + 1 else . end;
if . == 2 then true, break $done else empty end)
// false;
这里的关键当然是在第二次遇到该值时跳出循环。
解决方案
根据以上内容,解决方案是:
repeated(.[] | .downloadId; "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")