在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")'
jqplay 不支持 --stream 选项,所以上面的 demo 将 --stream 的输出作为 JSON 输入。
由于 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")'
jqplay 不支持 --stream 选项,所以上面的 demo 将 --stream 的输出作为 JSON 输入。