jq - 如果嵌套字典的第 n 个元素匹配,则选择一个项目

jq - selecting an item if the nth element of a nested dict matches

提问人:jjj 提问时间:11/17/2023 最后编辑:jjj 更新时间:11/17/2023 访问量:25

问:

我有这样以行分隔的 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 个进行过滤。我可以按以下任何方式过滤项目:RespStatusrecordsRespStatus

jq '.[] | select(.records[] | .tag=="RespStatus" and .value=="304")' < requests.log

但有时我需要过滤,如果只有第 n 个是 .RespStatus304

JSON JQ

评论

0赞 knittl 11/17/2023
那么对于您的示例输入,结果会是空的吗?
0赞 jjj 11/17/2023
我刚刚更新了问题,但在示例中,我想验证数组中的第二个是 304。有时可能是第一个,有时是第三个。不过,在最初的问题中,是的,如果我想要第一个,它不会返回任何东西。RespStatusRespStatus304

答:

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 个结果过滤。recordsRespStatusRespStatusRespStatusvalue
0赞 jjj 11/17/2023
完美,非常感谢!我看过,但逻辑是倒退的。nth