提问人:jjj 提问时间:11/17/2023 最后编辑:jjj 更新时间:11/17/2023 访问量:25
jq - 如果嵌套字典的第 n 个元素匹配,则选择一个项目
jq - selecting an item if the nth element of a nested dict matches
问:
我有这样以行分隔的 JSON 数据:
[
{
"id": 671731542,
"type": "BeReq",
"records": [
{ "tag": "foo", "value": "bar" },
{ "tag": "foo", "value": "bar" },
{ "tag": "RespStatus", "value": "200" },
{ "tag": "RespReason", "value": "OK" },
{ "tag": "foo", "value": "bar" },
{ "tag": "RespStatus", "value": "304" },
{ "tag": "RespReason", "value": "Not Modified" }
]
}
]
[
{
"id": 671731543,
"type": "BeReq",
"records": [
{ "tag": "foo", "value": "bar" },
{ "tag": "foo", "value": "bar" },
{ "tag": "RespStatus", "value": "200" },
{ "tag": "RespReason", "value": "OK" }
]
}
]
我希望能够根据数组中的第 n 个进行过滤。我可以按以下任何方式过滤项目:RespStatus
records
RespStatus
jq '.[] | select(.records[] | .tag=="RespStatus" and .value=="304")' < requests.log
但有时我需要过滤,如果只有第 n 个是 .RespStatus
304
答:
1赞
knittl
11/17/2023
#1
您可以使用第 n 个
过滤器来提取与您的条件匹配的元素:
.[] | select(nth(1;.records[]|select(.tag=="RespStatus")).value=="304")
(从零开始)
或者,映射数组,然后按索引访问:
.[] | select(.records|map(select(.tag=="RespStatus"))[1].value=="304")
(同样是从零开始的;它需要分配一个新数组)
评论
0赞
jjj
11/17/2023
对不起,我应该提到数组中可能有任意数量的其他标记元素,所以可能不是字面上的第一项。我还希望能够按第 n 个过滤,因此它必须首先过滤标记的项目,然后按第 n 个结果过滤。records
RespStatus
RespStatus
RespStatus
value
0赞
jjj
11/17/2023
完美,非常感谢!我看过,但逻辑是倒退的。nth
评论
RespStatus
RespStatus
304