JQ如何将多个对象合并为一个
JQ How to merge multiple objects into one
给定以下输入(这是具有另一个复杂查询的 100K+ 个对象的输出的简化版本):
echo '{ "a": { "b":"c", "d":"e" } }{ "a": { "b":"f", "d":"g" } }' | jq '.'
{
"a": {
"b": "c",
"d": "e"
}
}
{
"a": {
"b": "f",
"d": "g"
}
}
期望的输出:
{
"c": "e",
"f": "g"
}
或(更适合后续使用):
{
x: {
"c": "e",
"f": "g"
}
}
我一辈子都不知道该怎么做。我真正的问题当然是多对象输入数据,我真的不知道它是否有效JSON。 jq 生产并接受它,jshon 没有。我尝试了各种可能性,但其中 none 产生了我需要的东西。我认为这是最有可能的候选人:
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 }'
另一个,关闭,但没有 sigar:
'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"
}
}
假设您有 jq 1.5 或更高版本,并且您的 JSON 对象位于一个或多个文件中。然后对于您的第一个预期输出,您可以简单地写:
[inputs | .a | { (.b): .d} ] | add
这假定您使用 -n 命令行选项。我敢肯定,一旦您看到解决方案是多么简单,进一步的解释将是多余的。
对于您的第二个预期输出,您可以将上面的行包装在:
{x: _}
例如:
$ jq -ncf program.jq input.json
{"x":{"c":"e","f":"g"}}
p.s. 您使用 reduce
的方法很好,但您需要使用 -s 命令行选项。
p.p.s.你还欠我一瓶啤酒吗?
给定以下输入(这是具有另一个复杂查询的 100K+ 个对象的输出的简化版本):
echo '{ "a": { "b":"c", "d":"e" } }{ "a": { "b":"f", "d":"g" } }' | jq '.'
{
"a": {
"b": "c",
"d": "e"
}
}
{
"a": {
"b": "f",
"d": "g"
}
}
期望的输出:
{
"c": "e",
"f": "g"
}
或(更适合后续使用):
{
x: {
"c": "e",
"f": "g"
}
}
我一辈子都不知道该怎么做。我真正的问题当然是多对象输入数据,我真的不知道它是否有效JSON。 jq 生产并接受它,jshon 没有。我尝试了各种可能性,但其中 none 产生了我需要的东西。我认为这是最有可能的候选人:
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 }'
另一个,关闭,但没有 sigar:
'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"
}
}
假设您有 jq 1.5 或更高版本,并且您的 JSON 对象位于一个或多个文件中。然后对于您的第一个预期输出,您可以简单地写:
[inputs | .a | { (.b): .d} ] | add
这假定您使用 -n 命令行选项。我敢肯定,一旦您看到解决方案是多么简单,进一步的解释将是多余的。
对于您的第二个预期输出,您可以将上面的行包装在:
{x: _}
例如:
$ jq -ncf program.jq input.json
{"x":{"c":"e","f":"g"}}
p.s. 您使用 reduce
的方法很好,但您需要使用 -s 命令行选项。
p.p.s.你还欠我一瓶啤酒吗?