jq:如果字段存在则映射对象
jq: map object if field exists
这是我的jq代码:
def pick_nationality:
{nation: {country: .NACIONALITAT, code: "some code"} };
def pick_surname:
{name: {surname: .SURNAME, code: "some code"} };
map([pick_nationality, pick_surname])
当某些 .NACIONALITAT
或 .SURNAME
不存在于输入对象中时会出现问题:
{
"SURNAME": "surname1"
}
{
"NACIONALITAT": "nacionalitat1"
}
结果:
[
[
{
"nation": {
"country": null,
"code": "some code"
}
},
{
"name": {
"surname": "surname1",
"code": "some code"
}
}
],
[
{
"nation": {
"country": "nacionalitat1",
"code": "some code"
}
},
{
"name": {
"surname": null,
"code": "some code"
}
}
]
]
问题是当 .NATIONALITAT
字段不存在时我需要避免 pick_natinality...
期望的结果是:
[
[
{
"name": {
"surname": "surname1",
"code": "some code"
}
}
],
[
{
"nation": {
"country": "nacionalitat1",
"code": "some code"
}
}
]
]
有什么想法吗?
您可以使用 del 来表示相应的 null 值,例如
jq -r 'del(.[][] | select(.nation.country == null and .name.surname== null))'
您可以在捕获值之前添加测试:
def pick_nationality:
if has("NACIONALITAT")
then {nation: {country: .NACIONALITAT, code: "some code"} }
else empty end;
def pick_surname:
if has("SURNAME")
then {name: {surname: .SURNAME, code: "some code"} }
else empty end;
map([pick_nationality, pick_surname])
只有函数 return 当相关字段缺失时什么都没有。
def pick_nationality:
select(.NACIONALITAT) |
{nation: {country: .NACIONALITAT, code: "some code"} };
def pick_surname:
select(.SURNAME) |
{name: {surname: .SURNAME, code: "some code"} };
map([pick_nationality, pick_surname])
Demo 在 jqplay
这是我的jq代码:
def pick_nationality:
{nation: {country: .NACIONALITAT, code: "some code"} };
def pick_surname:
{name: {surname: .SURNAME, code: "some code"} };
map([pick_nationality, pick_surname])
当某些 .NACIONALITAT
或 .SURNAME
不存在于输入对象中时会出现问题:
{
"SURNAME": "surname1"
}
{
"NACIONALITAT": "nacionalitat1"
}
结果:
[
[
{
"nation": {
"country": null,
"code": "some code"
}
},
{
"name": {
"surname": "surname1",
"code": "some code"
}
}
],
[
{
"nation": {
"country": "nacionalitat1",
"code": "some code"
}
},
{
"name": {
"surname": null,
"code": "some code"
}
}
]
]
问题是当 .NATIONALITAT
字段不存在时我需要避免 pick_natinality...
期望的结果是:
[
[
{
"name": {
"surname": "surname1",
"code": "some code"
}
}
],
[
{
"nation": {
"country": "nacionalitat1",
"code": "some code"
}
}
]
]
有什么想法吗?
您可以使用 del 来表示相应的 null 值,例如
jq -r 'del(.[][] | select(.nation.country == null and .name.surname== null))'
您可以在捕获值之前添加测试:
def pick_nationality:
if has("NACIONALITAT")
then {nation: {country: .NACIONALITAT, code: "some code"} }
else empty end;
def pick_surname:
if has("SURNAME")
then {name: {surname: .SURNAME, code: "some code"} }
else empty end;
map([pick_nationality, pick_surname])
只有函数 return 当相关字段缺失时什么都没有。
def pick_nationality:
select(.NACIONALITAT) |
{nation: {country: .NACIONALITAT, code: "some code"} };
def pick_surname:
select(.SURNAME) |
{name: {surname: .SURNAME, code: "some code"} };
map([pick_nationality, pick_surname])
Demo 在 jqplay