如何对比JSON与数组并筛选匹配数据生成CSV?
解决方案:用jq结合Shell筛选JSON并转换为CSV
步骤1:准备Shell数组与JSON数据
假设你的JSON数据保存在data.json文件中,Shell数组定义如下:
arr=( test1 test3 )
步骤2:将Shell数组转换为jq可识别的JSON数组格式
通过Shell命令把普通数组转成jq能处理的JSON数组字符串:
jq_filter_arr=$(printf '"%s",' "${arr[@]}" | sed 's/,$//' | xargs echo "[" "]")
执行后jq_filter_arr的值为["test1","test3"]
步骤3:用jq筛选并生成CSV
执行以下命令完成筛选与格式转换:
jq -r --argjson filter "$jq_filter_arr" '.[0].key.objects[] | select(.name | IN($filter[])) | [.name, .some_values, ."other values"] | @csv' data.json
命令解释
--argjson filter "$jq_filter_arr":将处理后的JSON数组传入jq作为筛选条件变量.[0].key.objects[]:遍历JSON结构中嵌套的objects数组select(.name | IN($filter[])):筛选出name字段值存在于目标数组中的对象[.name, .some_values, ."other values"]:指定CSV输出的字段顺序(注意带空格的键需用双引号包裹)@csv:将选中的字段转换为标准CSV格式
输出结果
针对你提供的JSON数据,最终输出为:
"test1","some values",
(注:test1没有other values字段,对应位置为空值)
兼容低版本jq(<1.6)的写法
如果你的jq版本不支持IN函数,可替换为index:
jq -r --argjson filter "$jq_filter_arr" '.[0].key.objects[] | select($filter | index(.name)) | [.name, .some_values, ."other values"] | @csv' data.json
内容的提问来源于stack exchange,提问作者Mac
相关产品推荐
相关产品推荐

