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