You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用变量存储的对象键列表作为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"

注意事项

  1. 如果API返回的是单个议员对象(不是数组),去掉脚本里的.[]即可,比如:| [.[$keys[]]] | @csv
  2. 如果键名本身包含逗号,建议换用其他分隔符(比如竖线|),然后把split(",")改成split("|")
  3. 确保你的jq版本支持env对象(jq 1.4及以上版本都支持)

内容的提问来源于stack exchange,提问作者maqueiouseur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:31