如何用变量存储的对象键列表作为jq过滤器生成CSV
我明白你想做什么——写一个灵活的可复用Bash脚本,通过指定键列表从API的JSON响应里提取对应字段并生成CSV对吧?直接把$mp_keys丢给jq肯定不行,因为它会把整个字符串当成单个元素,这里给你几个靠谱的实现方案:
核心思路:把字符串键列表转成jq能识别的数组
jq本身不会自动解析Bash变量里的逗号分隔字符串,所以我们需要先在jq内部把这个字符串拆分成数组,再用数组来提取对应字段。
方案1:通过环境变量传递键列表
先把键列表导出为环境变量,让jq通过env对象读取,再拆分字符串:
# 设置要提取的键列表(逗号分隔) export mp_keys="name,gender,birthdate,constituency" # 调用API并生成CSV curl -s "https://mp.com" | jq -r ' # 从环境变量读取键列表,拆分成jq数组 $keys = (env.mp_keys | split(",")) # 遍历API返回的每个议员对象,提取对应键的值并转CSV | .[] | [.[$keys[]]] | @csv '
方案2:用jq的--arg参数传递变量
如果不想导出环境变量,直接用--arg把Bash变量传给jq,同样做拆分处理:
mp_keys="name,gender,birthdate" curl -s "https://mp.com" | jq -r --arg keys_str "$mp_keys" ' $keys = ($keys_str | split(",")) | .[] | [.[$keys[]]] | @csv '
进阶:带表头的完整可复用脚本
如果要做更规范的可复用脚本,可以加上表头输出、参数校验和文件保存功能:
#!/bin/bash # 可复用函数:从API获取议员数据并生成带表头的CSV fetch_mp_to_csv() { local api_url="$1" local mp_keys="$2" local output_file="${3:-mp_data.csv}" # 参数校验 if [[ -z "$api_url" || -z "$mp_keys" ]]; then echo "用法: fetch_mp_to_csv <API地址> <键列表(逗号分隔)> [输出文件名]" echo "示例: fetch_mp_to_csv https://mp.com 'name,gender,birthdate' my_mp_list.csv" return 1 fi # 调用API,先输出表头再输出数据行 curl -s "$api_url" | jq -r --arg keys_str "$mp_keys" ' $keys = ($keys_str | split(",")) # 先输出表头(键列表本身转CSV),再输出每个对象的字段值 | $keys, (.[] | [.[$keys[]]]) | @csv ' > "$output_file" echo "✅ 议员数据已保存到: $output_file" } # 调用示例(取消注释即可使用) # fetch_mp_to_csv "https://mp.com" "name,gender,birthdate,party"
注意事项
- 如果API返回的是单个议员对象(不是数组),去掉脚本里的
.[]即可,比如:| [.[$keys[]]] | @csv - 如果键名本身包含逗号,建议换用其他分隔符(比如竖线
|),然后把split(",")改成split("|") - 确保你的jq版本支持
env对象(jq 1.4及以上版本都支持)
内容的提问来源于stack exchange,提问作者maqueiouseur
相关产品推荐
相关产品推荐

