【发布时间】:2020-05-06 12:45:13
【问题描述】:
我一直在尝试将一些 JSON 转换为 csv,但遇到以下问题:
我有以下输入 json:
{"id": 100, "a": [{"t" : 1,"c" : 2 }, {"t": 2, "c" : 3 }] }
{"id": 200, "a": [{"t": 2, "c" : 3 }] }
{"id": 300, "a": [{"t": 1, "c" : 3 }] }
我希望得到以下 CSV 输出:
id,t1,t2
100,2,3
200,,3
300,3,
不幸的是,如果其中一个选择不匹配,JQ 不会输出。 示例:
echo '{ "id": 100, "a": [{"t" : 1,"c" : 2 }, {"t": 2, "c" : 3 }] }' | jq '{t1: (.a[] | select(.t==1)).c , t2: (.a[] | select(.t==2)).c }'
输出:
{ "t1": 2, "t2": 3 }
但如果其中一个对象 select 返回不匹配,则它根本不会返回。 示例:
echo '{ "id": 100, "a": [{"t" : 1,"c" : 2 }] }' | jq '{t1: (.a[] | select(.t==1)).c , t2: (.a[] | select(.t==2)).c }'
预期输出:
{ "t1": 2, "t2": null }
有谁知道如何使用 JQ 实现这一目标?
编辑:
根据@peak 的评论,我找到了我正在寻找的解决方案。
jq -r '["id","t1","t2"],[.id, (.a[] | select(.t==1)).c//null, (.a[] | select(.t==2)).c//null ]|@csv'
替代运算符完全符合我的要求。 Alternative Operator
【问题讨论】:
-
请同时描述基本要求,以便其他人更容易受益。
标签: json export-to-csv jq