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

如何在Bash中通过变量指定jq的输出字段?

动态指定jq提取字段的解决方案

问题背景

给定如下JSON数据:

{
    "data": [
        {
            "datum": "2023-01-11 00:00:00",
            "prijs": "0.005000",
            "prijsZP": "0.161550",
            "prijsEE": "0.181484",
            "prijsTI": "0.160970"
        },
        {
            "datum": "2023-01-11 01:00:00",
            "prijs": "0.000000",
            "prijsZP": "0.155500",
            "prijsEE": "0.175434",
            "prijsTI": "0.154920"
        }
    ]
}

需求是动态指定jq要提取的字段(比如仅datum和prijsTI),但直接用--arg传递字段选择字符串时失败:

myJQselect=".datum, .prijsTI"
cat data.json |jq -r --arg myJQselect "$myJQselect" '.data[]|[$myJQselect]|@csv'

返回的是字符串".datum, .prijsTI"而非实际字段值——因为--arg传递的是普通字符串,jq不会把它当作表达式解析。


解决方案

方法1:用--argjson传递字段名数组

这是最直接的方式,把要提取的字段名存成数组变量,传给jq后动态取值:

# 定义字段名数组
fields='["datum", "prijsTI"]'
# 执行jq命令
cat data.json | jq -r --argjson fields "$fields" '.data[] | [$fields[] as $key | .[$key]] | @csv'

执行后输出正确的CSV结果:

"2023-01-11 00:00:00","0.160970"
"2023-01-11 01:00:00","0.154920"

方法2:用--arg传递逗号分隔的字段字符串,再拆分处理

如果习惯用逗号分隔的字符串传递字段,可以先把字符串拆成数组,再逐个取值:

# 定义逗号分隔的字段字符串
field_str="datum,prijsTI"
# 执行jq命令
cat data.json | jq -r --arg field_str "$field_str" '
  ($field_str | split(",")) as $fields
  | .data[]
  | [$fields[] as $key | .[$key]]
  | @csv
'

该方法与方法1效果一致,适合从命令行参数或配置文件读取逗号分隔字段的场景。


注意事项

  • 禁止用--arg传递jq表达式字符串:jq不会解析--arg传入的字符串为jq代码,直接使用[$myJQselect]只会输出字符串本身。
  • 字段名需与JSON中的键完全匹配,区分大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:25:23