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))'

Demo

您可以在捕获值之前添加测试:

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