如何使用jq及自定义压缩函数实现数组配对
使用jq转换嵌套JSON数组为键值对对象数组
假设你的输入是类似这样的嵌套JSON数组(第一个子数组是字段名,后续子数组是对应值):
[ ["USER", "TTY", "TIME"], ["root", "pts/0", "00:00:01"], ["guest", "pts/1", "00:00:05"] ]
可以用这条jq命令实现转换:
.[0] as $keys | .[1:] | map([$keys, .] | transpose | from_entries)
命令拆解
.[0] as $keys:提取第一个子数组作为字段名列表,存入变量$keys.[1:]:筛选出除字段名外的所有数据行map(...):遍历每一行数据做转换[$keys, .] | transpose:把字段名列表和当前数据行配对,转成[[键1, 值1], [键2, 值2]]的结构from_entries:将上述结构直接转换成键值对对象
执行后得到的输出是:
[ { "USER": "root", "TTY": "pts/0", "TIME": "00:00:01" }, { "USER": "guest", "TTY": "pts/1", "TIME": "00:00:05" } ]
如果遇到字段名和值的数量不匹配的情况,from_entries会自动忽略多余的键或值,也可以额外添加提示逻辑:
.[0] as $keys | .[1:] | map( if ($keys | length) != (. | length) then @warn ("Mismatched lengths at row: \(index)") end; [$keys, .] | transpose | from_entries )
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

