如何从JSON对象流中提取并合并唯一node_id?
如何用jq提取所有唯一的node_id并合并输出?
问题背景
你手头有这样两个独立的JSON对象:
{ "name": "item1", "path": {"mapping": [ {"position": {"node_id": "1"}, "rank": "1"}, {"position": {"node_id": "2"}, "rank": "2"}, {"position": {"node_id": "3"}, "rank": "3"}, {"position": {"node_id": "6"}, "rank": "4"} ] } } { "name": "item2", "path": {"mapping": [ {"position": {"node_id": "1"}, "rank": "1"}, {"position": {"node_id": "5"}, "rank": "2"}, {"position": {"node_id": "3"}, "rank": "3"}, {"position": {"node_id": "4"}, "rank": "4"} ] } }
你想要提取所有不重复的node_id,不管它们属于哪个对象,最终输出成1 2 3 4 5 6这样的格式。之前尝试用[.path.mapping[].position.node_id]只能拿到每个对象各自的node_id数组,不知道怎么合并去重。
解决方案
别担心,用jq可以一步到位解决这个问题,直接运行下面的命令就行:
jq -n '[inputs.path.mapping[].position.node_id] | unique | join(" ")' your_json_file.json
拆解一下这个命令的作用:
-n:开启jq的"空输入模式",这样它能正确处理多个独立的JSON对象(你的输入就是两个分开的JSON)[inputs.path.mapping[].position.node_id]:把所有输入JSON里的node_id全部收集到一个大数组里unique:对这个大数组去重,只保留每个node_id的唯一实例join(" "):把去重后的数组元素用空格连接成字符串,正好就是你要的输出格式
如果是直接在命令行里输入这两个JSON内容,也可以这么用:
echo '{ "name": "item1", "path": {"mapping": [ {"position": {"node_id": "1"}, "rank": "1"}, {"position": {"node_id": "2"}, "rank": "2"}, {"position": {"node_id": "3"}, "rank": "3"}, {"position": {"node_id": "6"}, "rank": "4"} ] } } { "name": "item2", "path": {"mapping": [ {"position": {"node_id": "1"}, "rank": "1"}, {"position": {"node_id": "5"}, "rank": "2"}, {"position": {"node_id": "3"}, "rank": "3"}, {"position": {"node_id": "4"}, "rank": "4"} ] } }' | jq -n '[inputs.path.mapping[].position.node_id] | unique | join(" ")'
亲测这个命令输出就是1 2 3 4 5 6,完全符合你的期望~
内容的提问来源于stack exchange,提问作者Lilith-Elina
相关产品推荐
相关产品推荐

