如何用jq将两个等长数组的内容转换为键值对?
解决方法
要把values和counts两个数组的元素一一对应生成键值对对象,你可以用以下两种jq实现方式:
方法一:通用写法(兼容所有jq版本)
jq '[.values, .counts] | transpose | map({key: .[0], value: .[1]}) | from_entries' input.json
步骤说明:
[.values, .counts]:把两个目标数组打包成一个二维数组,得到[["5","10","15","20","25"], [17,1014,22,9,11]]transpose:将二维数组转置,变成[["5",17], ["10",1014], ["15",22], ["20",9], ["25",11]]map({key: .[0], value: .[1]}):把每个子数组转换成{key: "5", value:17}这种符合from_entries要求的结构from_entries:将上述结构的数组转换成最终的键值对对象
方法二:精简写法(jq 1.6及以上版本可用)
jq 1.6新增了zip函数,能直接把两个数组合并成配对的子数组,写法更简洁:
jq 'zip(.values, .counts) | from_entries' input.json
zip(.values, .counts)直接生成[["5",17], ["10",1014], ...],再通过from_entries直接转成对象。
你之前的命令为什么无效?
with_entries是用来修改已有对象的键值对条目的,比如给现有对象的键重命名、修改值,但你的原始数据是两个独立数组,根本不是对象的条目结构,所以用with_entries完全不对路,这就是之前尝试失败的原因。
内容的提问来源于stack exchange,提问作者André Letterer
相关产品推荐
相关产品推荐

