如何在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
相关产品推荐
相关产品推荐

