在JQ中展开大数组和select个元素

Expand large array and select elements in JQ

由于 streaming/filtering JSON 在概念上的工作方式,这可能是不可能的,但假设我有类似以下内容的东西 JSON:

[
  {
    "name": "account_1",
    "type": "account"
  },
  {
    "name": "account_2",
    "type": "account"
  },
  {
    "name": "user_1",
    "type": "user"
  },
  {
    "name": "user_2",
    "type": "user"
  }
]

现在我只想打印出用户对象。

我知道我可以用这样的东西过滤到流式实体:

cat file.json | jq --stream 'select(.[0][1] == "type" and .[1] == "user" | .)'

这会产生:

[
  [
    2,
    "type"
  ],
  "user"
]
[
  [
    3,
    "type"
  ],
  "user"
]

有什么方法可以打印出这些类型的父对象而不是类型实体?例如。我想出去:

[
  {
    "name": "user_1",
    "type": "user"
  },
  {
    "name": "user_2",
    "type": "user"
  }
]

没有流媒体,这是一个非常简单的练习。例如:

cat file.json | jq '.[] | select(.type=="user")'

实际上实际的输入文件大约是 5GB,所以我需要使用流输入,但我似乎无法在启用 --stream 的情况下获得正确的 jq 语法。例如

cat file.json | jq --stream '.[] | select(.type=="user")'

生产:

jq: error (at <stdin>:3): Cannot index array with string "type"
jq: error (at <stdin>:5): Cannot index array with string "type"
...

(编辑以包含所需的输出)

只需截断顶级数组。

jq -n --stream 'fromstream(1 | truncate_stream(inputs)) | select(.type == "user")'

Online demo

jqplay 不支持 --stream 选项,所以上面的 demo 将 --stream 的输出作为 JSON 输入。