我的输入文件是以换行符分隔的 JSON (ndjson
),看起来像这样:
{
"login": "dmaxfield",
"id": 7449977,
...
}
{
"login": "dmaxfield",
"id": 7449977,
...
}
我可以使用以下命令获取所有的
login
名称:cat members | jq '.[].login'
,但我还没有找到获取login
和id
的语法?你可以使用 jq '.[] | .login, .id'
来获取每个登录名及其ID。
jq
与对象序列非常兼容 - 不需要数组包装器。需要删除...
字符串和最后的逗号,但我认为这是暗示的。 - Peter V. Mørchjq '.[] | {login, id}'
- Cameron Taggartjq '.[] | {login.name, id}'
看起来似乎无效,正确的方式是什么,请告诉我? - zyxuejq '.[] | {name: .login.name, id}'
。它的意思是选取JSON对象中的每个元素(使用.[]
),并从中提取login.name
属性,将其命名为name
,同时保留id
属性,最终将这两个属性组成一个新的对象。 - Alex Grounds这对我起作用:
> echo '{"a":1,"b":2,"c":3}{"a":1,"b":2,"c":3}' | jq '{a,b}'
{
"a": 1,
"b": 2
}
{
"a": 1,
"b": 2
}
ls *jpg | xargs -n 1 exiftool -json | jq '{ SourceFile,CreateDate,CreationDate,Make,Model,DateTimeOriginal,SceneType,FileAccessDate,FileModifyDate,FileInodeChangeDate,SceneCaptureType,ModifyDate }'
- Sridhar Sarnobat.
,我花了一段时间才意识到这一点。 - Sridhar Sarnobat这里再提供一个例子(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"
}
没有示例数据:
jq ".[] | {id, name: .private_info.name}" -
.[]
: 遍历数组
{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
]
内置函数 pick
对于切片对象(即投影)非常有用。
$ cat example.ndjson | jq -c 'pick(.login, .id)'
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
$ 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}}
.[]
。$ cat example.json | jq '.[] | pick(.login, .id)' | jq -s '.'
[
{
"login": "dmaxfield",
"id": 7449977
},
{
"login": "eiffel",
"id": 7449978
}
]
使用 { login, id }
,这是 { login: .login, id: .id }
的简写。
$ cat example.ndjson | jq -c '{ login, id }'
{"login":"dmaxfield","id":7449977}
{"login":"eiffel","id":7449978}
$ 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}}
$ cat example.json | jq '.[] | { login, id }' | jq -s '.'
[
{
"login": "dmaxfield",
"id": 7449977
},
{
"login": "eiffel",
"id": 7449978
}
]
我使用了以下的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 } }
]