2017-09-16 139 views
1

我有一个JSON列表,我想在命令行上进行合并。将json对象与jq合并

输入:
[ 
{ 
    "ipaddress": "10.10.10.222", 
    "name": "alice" 
}, 
{ 
    "ipaddress": "10.20.20.77", 
    "name": "bob" 
}, 
{ 
    "version": "6.7", 
    "name": "alice" 
}, 
{ 
    "version": "5.2.2", 
    "name": "bob" 
} 
] 

预期输出:

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"}, 
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"} 

你能帮助我吗?谢谢。 贝恩德

+0

也许你的答案可以找到[这里](https://stackoverflow.com/questions/21450060/how-to-加入二 - JSON-对象中的JavaScript-而不-使用-jquery的)。 – Abe

+0

@Abe - jq和jquery不一样。 –

回答

1

如果样本数据是在data.json,该命令如果什么是实际所需的是一个对象的单个阵列则命令

$ jq -Mr '[ group_by(.name)[] | add | tojson ] | join(",\n")' data.json 

时会产生输出

{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"}, 
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"} 

然而

$ jq -M '[group_by(.name)[] | add]' data.json 

产生

[ 
    { 
    "ipaddress": "10.10.10.222", 
    "name": "alice", 
    "version": "6.7" 
    }, 
    { 
    "ipaddress": "10.20.20.77", 
    "name": "bob", 
    "version": "5.2.2" 
    } 
] 
3
jq -c 'group_by(.name)[]|add' input.json 

产生JSON对象流(即没有插入逗号)。

更好的是避免group_by/1完全,因为它涉及到一个排序:

def add_by(f): 
    reduce .[] as $x ({}; ($x|f) as $f | .[$f] += [$x]) 
    | [.[] | add]; 

add_by(.name) 
+0

你介意解释减少部分的工作原理吗?我看到会发生什么:它使一个对象的键是“alice”和“bob”,并且这些键的值是用具有相应.name值的对象填充的数组。但是,它如何只选择带有“爱丽丝”的对象来使用“爱丽丝”键?这是逃避我。谢谢! – user197693

+0

@ user197693 - 'reduce'行通过.name对对象进行分组;你可以通过添加'调试'过滤器来看到这一点。 – peak

+0

我想我现在看到它。我不知道调试过滤器。谢谢。 – user197693