Json JQ如何将多个对象合并为一个对象

Json JQ如何将多个对象合并为一个对象,json,object,stream,jq,jsonstream,Json,Object,Stream,Jq,Jsonstream,给定以下输入(这是另一个复杂查询的100K+对象的输出的一个小调版本): 期望输出: { "c": "e", "f": "g" } 或(更适合后续使用): 我一辈子都不知道该怎么做。我真正的问题当然是多对象输入数据,我真的不知道它是否是有效的JSON。Jq生产并接受,jshon不生产。我尝试了各种可能性,但没有一种能满足我的需要。我认为这是最有可能的候选人: echo '{ "a": { "b":"c", "d":"e" } }{ "a": { "b":"f", "d":"g" }

给定以下输入(这是另一个复杂查询的100K+对象的输出的一个小调版本):

期望输出:

{
   "c": "e",
   "f": "g"
}
或(更适合后续使用):

我一辈子都不知道该怎么做。我真正的问题当然是多对象输入数据,我真的不知道它是否是有效的JSON。Jq生产并接受,jshon不生产。我尝试了各种可能性,但没有一种能满足我的需要。我认为这是最有可能的候选人:

echo '{ "a": { "b":"c", "d":"e" } }{ "a": { "b":"f", "d":"g" } }' | jq ' . | { (.a.b): .a.d }'
{
   "c": "e"
}
{
   "f": "g"
}
但是,唉。我尝试过的其他事情:

' . | { x: { (.a.b): .a.d } }'
'{ x: {} | . | add }'
'{ x: {} | . | x += }'
'{ x: {} | x += . }'
'x: {} | .x += { (.a.b): .a.d }'
'{ x: {} } | .x += { (.a.b): .a.d }'
另一个,接近,但没有信号:

'reduce { (.a.b): .a.d } as $item ({}; . + $item)'
{
  "c": "e"
}
{
  "f": "g"
}
谁愿意启发我

因此,感谢@peak,上述用例中的完整答案是

echo '{ "a": { "b": "c", "d": "e" } }{ "a": { "b": "f", "d": "g" } }' | jq -n '{ x: [inputs | .a | { (.b): .d} ] | add }'
{
  "x": {
    "c": "e",
    "f": "g"
  }
}

假设您有JQ1.5或更高版本,并且JSON对象位于一个或多个文件中。然后,对于第一个预期输出,您可以简单地编写:

[inputs | .a | { (.b): .d} ] | add
这假定您使用-n命令行选项。我相信,一旦你看到这个解决方案是多么简单,进一步的解释将是多余的

对于第二个预期输出,您可以将上面的行换行:

{x: _}
例如:

p.s.您使用
reduce
的方法很好,但是您需要使用-s命令行选项


p.p.s.你还欠我一杯啤酒吗?

你离我很近,比我到现在都近,我不得不承认,但是输入是一个文件:-((PS.要买一整箱?;-))正如我所说的,
输入的解决方案无论有多少个文件都有效。不,是“;”给出语法错误(linux上为am)。去掉它会得到{“f”:“g},而不是{“c”:“e”,“f”:“g}:-(该;是一个拼写错误。已修复。去掉输入,结果仍然是| jq'[inputs |.a{.b:.d}]|添加{“f”:“g}而不是{“c”:“e”,“f”:“g}
[inputs | .a | { (.b): .d} ] | add
{x: _}
$ jq -ncf program.jq input.json
{"x":{"c":"e","f":"g"}}