首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据缺少的元素与JQ合并?

如何根据缺少的元素与JQ合并?
EN

Stack Overflow用户
提问于 2021-03-09 06:42:50
回答 1查看 42关注 0票数 1

我正在使用两个JSON文件: dest_sr.json和src_templates.json

我想创建一个新的JSON对象,它将来自JSON对象#1 (特别是Template_SR键)和JSON对象#2 ( Template_Name和Template_ID键)的键组合在一起,但前提是在Pool_ID上找不到与对象#1和对象#2都匹配的VM模板

对于两个给定的JSON对象: dest_sr.json:

代码语言:javascript
复制
{
  "Type": "pool",
  "Pool_ID": "adb58e84",
  "Template_SR": "fc820294"
}
{
  "Type": "pool",
  "Pool_ID": "d2dea684",
  "Template_SR": "313f2a07"
}

src_templates.json:

代码语言:javascript
复制
{
  "Type": "VM-template",
  "Template_Name": "CentOS 7 CloudInit V1",
  "Template_ID": "9b1833a3",
  "Pool_ID": "adb58e84"
}

我想创建一个新的JSON对象,如下所示:

代码语言:javascript
复制
{
  "Template_ID",:"9b1833a3",
  "Template_SR":"313f2a07",
  "Template_Name":"CentOS 7 CloudInit V1",
}

使用Stackoverflow,我能够从示例中拼凑出一个hashJoin,它在.Pool_ID属性上执行hashJoin以创建一个新对象:

代码语言:javascript
复制
# hashJoin(a1; a2; field) expects a1 and a2 to be arrays of JSON objects
# and that for each of the objects, the field value is a string.
# A relational join is performed on "field".

def hashJoin(a1; a2; field):
  # hash phase:
  (reduce a1[] as $o ({};  . + { ($o | field): $o } )) as $h1
  | (reduce a2[] as $o ({};  . + { ($o | field): $o } )) as $h2
  # join phase:
  | reduce ($h1|keys[]) as $key
      ([]; if $h2|has($key) then . + [ $h1[$key] + $h2[$key] ] else . end) ;

hashJoin( $file1; $file2; .Pool_ID)[]

当我调用JQ来执行hashJoin时,我得到了一个新对象,如下所示:

代码语言:javascript
复制
/tmp $ jq -nc --slurpfile file1 /tmp/dest_sr.json --slurpfile file2 /tmp/src_templates.json -f hashJoinSimple.jq

{
  "Type":"VM-template",
  "Pool_ID":"adb58e84",
  "Template_SR":"fc820294",
  "Template_Name":"CentOS 7 CloudInit V1",
  "Template_ID":"9b1833a3"
}

有没有什么办法可以让我的合并代码使对象看起来像这样?

代码语言:javascript
复制
{
  "Type":"VM-template",
  "Pool_ID":"d2dea684",
  "Template_SR":"fc820294",
  "Template_Name":"CentOS 7 CloudInit V1",
  "Template_ID":"9b1833a3"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-09 08:59:52

我认为考虑到您的特定输入和期望的结果,我不认为散列是必要的。似乎您所需要做的就是从dest_sr.json中选择与src_templates.json中的id不匹配的输入,然后将其与模板中所需的值组合在一起。

代码语言:javascript
复制
$ jq --argfile template src_templates.json '
select(.Pool_ID != $template.Pool_ID) + ($template|{Template_Name,Template_ID})
' dest_sr.json
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66538285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档