如何使用Jq合并两个JSON参数文件并实现同名键覆盖去重
使用Jq合并key=value格式JSON数组的方案
你的需求核心是合并两个存储key=value字符串的JSON数组,规则为保留所有唯一配置,同名配置以第二个文件的值为准。之前的命令无法生效,是因为数组元素是普通字符串,jq不会自动识别=作为键分隔符做对象级合并。
可直接使用的命令
jq -s ' flatten | map(split("=") | {(.[0]): .[1]}) | add | to_entries | map("\(.key)=\(.value)") ' param1.json param2.json
如果需要一行执行可以用简写版本:
jq -s 'flatten|map(split("=")|{(.[0]):.[1]})|add|to_entries|map("\(.key)=\(.value)")' param1.json param2.json
逻辑说明
-s(slurp模式):将两个输入文件的内容读取到同一个数组中,方便统一处理flatten:把两层嵌套的数组(两个文件各自的数组)拍平为单层字符串数组,顺序为param1的所有元素在前,param2的所有元素在后map(split("=") | {(.[0]): .[1]}):遍历每个配置字符串,按=切分后转为单键值对象,例如"age=40"会转为{"age": "40"}add:将所有单键对象合并为一个总对象,由于param2的配置项排在后面,同名键会自动覆盖param1的旧值,正好满足第二个文件优先级更高的要求to_entries | map("\(.key)=\(.value)"):将合并完成的对象重新转换为key=value格式的字符串数组,输出格式和预期完全匹配
执行结果
运行上述命令后会输出你期望的结果:
[ "name=xyz", "age=42", "email=qqqq", "drivingLicense=2761" ]
之前尝试的命令问题说明
jq -s '.[0] + .[1]':仅做简单的数组拼接,没有任何去重、同键覆盖逻辑,必然会保留重复配置项jq '. * input':该语法用于合并两个JSON对象,而你的输入是数组类型,直接使用无法得到正确结果
内容的提问来源于stack exchange,提问作者Mans
相关产品推荐
相关产品推荐

