If statement jq保留捕获组中缺少的阵列对象并更新阵列

If statement jq保留捕获组中缺少的阵列对象并更新阵列,if-statement,jq,If Statement,Jq,输入 预期产出 到目前为止,我已经试过了 jq'map(+.tags[].value | capture(“domain:(?))))))| map(+.tags[].value | capture(“apiname:(?)))))))| map(del(.tags))” 来自上述命令的部分输出 如您所见,这里的问题是,如果没有任何一个捕获组字段,我将完全失去其他对象。输入中的第二个对象具有apiname但缺少“域”,第三个对象具有“域”但缺少“apiname”。如示例输出中所述,如果任何对象不

输入

预期产出

到目前为止,我已经试过了

jq'map(+.tags[].value | capture(“domain:(?))))))| map(+.tags[].value | capture(“apiname:(?)))))))| map(del(.tags))”

来自上述命令的部分输出

如您所见,这里的问题是,如果没有任何一个捕获组字段,我将完全失去其他对象。输入中的第二个对象具有apiname但缺少“域”,第三个对象具有“域”但缺少“apiname”。如示例输出中所述,如果任何对象不存在,则它们应显示为“-”


请更新jq命令以实现此目的吗?

jq
解决方案:

jq '{domain: "-", apiname: "-"} as $o 
    | map([.tags[] | .value | split(":") | {(.[0]) : .[1]}] | add | $o + .)' input.json
  • {domain:“-”,apiname:“-”}作为$o
    -用作模板对象
输出:

[
  {
    "domain": "sourcing",
    "apiname": "src1"
  },
  {
    "domain": "-",
    "apiname": "fin1"
  },
  {
    "domain": "fin1",
    "apiname": "-"
  }
]

jq
解决方案:

jq '{domain: "-", apiname: "-"} as $o 
    | map([.tags[] | .value | split(":") | {(.[0]) : .[1]}] | add | $o + .)' input.json
  • {domain:“-”,apiname:“-”}作为$o
    -用作模板对象
输出:

[
  {
    "domain": "sourcing",
    "apiname": "src1"
  },
  {
    "domain": "-",
    "apiname": "fin1"
  },
  {
    "domain": "fin1",
    "apiname": "-"
  }
]

这是另一种方法。这假设您的
标记
数组只包含您期望的名称

map(
    reduce (.tags[].value | split(":")) as [$k,$v] (
        {domain:"-",apiname:"-"};
        .[$k] = $v
    )
)

对于一个更通用的解决方案,它不采用固定的名称,而只是将标签展平,我会这样做:

map(
    reduce (.tags[].value | split(":")) as [$k,$v] (
        del(.tags);
        .[$k] = $v
    )
)
然后在访问字段时,只需使用alternative运算符设置默认值

(.domain // "-") as $domain

这是另一种方法。这假设您的
标记
数组只包含您期望的名称

map(
    reduce (.tags[].value | split(":")) as [$k,$v] (
        {domain:"-",apiname:"-"};
        .[$k] = $v
    )
)

对于一个更通用的解决方案,它不采用固定的名称,而只是将标签展平,我会这样做:

map(
    reduce (.tags[].value | split(":")) as [$k,$v] (
        del(.tags);
        .[$k] = $v
    )
)
然后在访问字段时,只需使用alternative运算符设置默认值

(.domain // "-") as $domain
如果“tag:value”字符串的“value”部分可能包含冒号(“:”),那么使用
split
会变得不必要的棘手(甚至可能效率低下),因此使用
capture
可能更容易,也许可以按照@RomanPerekhrest:

{domain:"-", apiname:"-"} as $default
| map([.tags[].value
       | capture("(?<k>[^:]*):(?<v>.*)")
       | {(.k): .v} ]
      | add
      | $default + .)
{domain:“-”,apiname:“-”}作为$default
|映射([.tags[].value
|捕获((?[^:]*):(?*)
|{(.k):.v}]
|加
|$default+)
如果“tag:value”字符串的“value”部分可能包含冒号(“:”),那么使用
拆分
会变得不必要的棘手(甚至可能效率低下),因此使用
捕获
可能会更容易,也许可以按照@RomanPerekhrest:

{domain:"-", apiname:"-"} as $default
| map([.tags[].value
       | capture("(?<k>[^:]*):(?<v>.*)")
       | {(.k): .v} ]
      | add
      | $default + .)
{domain:“-”,apiname:“-”}作为$default
|映射([.tags[].value
|捕获((?[^:]*):(?*)
|{(.k):.v}]
|加
|$default+)