我的输入文件看起来像这样:
{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}
Run Code Online (Sandbox Code Playgroud)
我可以用这个得到所有的登录名: cat members | jq '.[].login'
但我无法破解语法来获取登录名和身份证?
小智 75
您可以使用jq '.[] | .login, .id'获取每个登录名及其ID.
Pet*_*rch 42
这对我有用:
> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
"a": 1,
"b": 2
}
{
"a": 1,
"b": 2
}
Run Code Online (Sandbox Code Playgroud)
nek*_*uuu 12
内置函数pick对于切片对象(即投影)很有用。
$ cat example.ndjson | jq -c 'pick(.login, .id)'
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
Run Code Online (Sandbox Code Playgroud)
嵌套对象也可以很好地处理。
$ cat example.ndjson | jq -c 'pick(.login, .id, .nested.obj)'
{"login":"dmaxfield","id":7449977,"nested":{"obj":1.23}}
{"login":"eiffel","id":7449978,"nested":{"obj":4.56}}
Run Code Online (Sandbox Code Playgroud)
如果您的输入格式为 JSON 而不是 NDJSON,请在脚本前面添加.[].
$ cat example.json | jq '.[] | pick(.login, .id)' | jq -s '.'
[
{
"login": "dmaxfield",
"id": 7449977
},
{
"login": "eiffel",
"id": 7449978
}
]
Run Code Online (Sandbox Code Playgroud)
Use { login, id },它是 的简写{ login: .login, id: .id }。
$ cat example.ndjson | jq -c '{ login, id }'
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
Run Code Online (Sandbox Code Playgroud)
对于嵌套对象,可以这样写:
$ cat example.ndjson | jq -c '{ login, id, nested: { obj: .nested.obj } }'
{"login":"dmaxfield","id":7449977,"nested":{"obj":1.23}}
{"login":"eiffel","id":7449978,"nested":{"obj":4.56}}
Run Code Online (Sandbox Code Playgroud)
对于普通 JSON 文件:
$ cat example.json | jq '.[] | { login, id }' | jq -s '.'
[
{
"login": "dmaxfield",
"id": 7449977
},
{
"login": "eiffel",
"id": 7449978
}
]
Run Code Online (Sandbox Code Playgroud)
我使用了以下 NDJSON 文件和 JSON 文件。
$ cat example.ndjson
{ "login": "dmaxfield", "id": 7449977, "foo": true, "nested": { "obj": 1.23 } }
{ "login": "eiffel", "id": 7449978, "foo": false, "nested": { "obj": 4.56 } }
$ cat example.json
[
{ "login": "dmaxfield", "id": 7449977, "foo": true, "nested": { "obj": 1.23 } },
{ "login": "eiffel", "id": 7449978, "foo": false, "nested": { "obj": 4.56 } }
]
Run Code Online (Sandbox Code Playgroud)
小智 11
在这里再提供一个例子(jq-1.6):
遍历数组并选择对象元素的字段和该对象中的对象字段
echo '[{"id":1, "private_info": {"name": "Ivy", "age": 18}}, {"id":2, "private_info": {"name": "Tommy", "aga": 18}}]' | jq ".[] | {id: .id, name: .private_info.name}" -
{
"id": 1,
"name": "Ivy"
}
{
"id": 2,
"name": "Tommy"
}
Run Code Online (Sandbox Code Playgroud)
没有示例数据:
jq ".[] | {id, name: .private_info.name}" -
Run Code Online (Sandbox Code Playgroud)
.[]: 遍历一个数组
{id, name: .private_info.name}: 将 .id 和 .private_info.name 分别包装成一个字段名为“id”和“name”的对象
为了选择缩进不同级别(即第一和第二级别)的值,可以使用以下命令:
$ echo '{"a":{"aa":1,"ab":2},"b":3,"c":4}{"a":{"aa":5,"ab":6},"b":7,"c":8}' \
> | jq '[.a.aa,.a.ab,.b]'
[
1,
2,
3
]
[
5,
6,
7
]
Run Code Online (Sandbox Code Playgroud)