用另一个字段的值替换 jq 中 select 命令的空值

Replace null values from a select command in jq with the value of another field

目标是搜索 part_description 的空值并插入部分字段值。

[
  {
    "part": "brake-01982",
    "part_description": null,
  }
]

预期输出

[
  {
    "part": "brake-01982",
    "part_description": "brake-01982",
  }
]

命令: jq '(.[] | select(.part_description==null).part_description) |= .part'

结果没有变化

如果我尝试插入一个字符串值,它会起作用。双引号字符串会产生我所期望的结果。下面的演示。我如何将另一个字段值传递给此命令而不是带引号的字符串?

命令:jq'(.[] | select(.part_description==null).part_description) |= "测试"'

Demo

输出

[
  {
    "part": "brake-01982",
    "part_description": "test"
  }
]

备选运算符 // 保留第一个值,除非它是 nullfalseempty(即缺失),在这种情况下它会承担第二。结合更新运算符 |=,这可以收缩为 //=.

jq '.[] |= (.part_description //= .part)'
[
  {
    "part": "brake-01982",
    "part_description": "brake-01982"
  }
]

Demo


编辑:要严格仅在 null 的情况下进行更新,即保留 false 的值,并且在缺少字段时不创建该字段,过滤器需要明确检查null:

jq '.[] |= ((select(has("part_description")).part_description | select(. == null)) = .part)'
[
  {
    "part": "brake-01982",
    "part_description": "brake-01982"
  }
]

Demo

Goal is to search for null values of part_description ....

如果这确实是目标,那么您需要测试 null 而不是依赖 ////=。所以你可以写:

map( if has("part_description") and .part_description == null
     then .part_description = .part else . end )