简短的回答
变体 A:in2csv
(csvkit)+csvtool
- 将您的 json 包裹在括号中
- 使用
in2csv
's-I
选项来避免意外行为
- 使用命令转置两行 CSV,例如csvtool
echo "[$the_json]" | in2csv -I -f json | csvtool transpose -
变体 B:jq
改用
这是一个仅使用的解决方案jq
:(https://stedolan.github.io/jq/)
echo "$the_json" | jq -r 'to_entries[] | [.key, .value] | @csv'
取自如何将对象映射到数组以便可以将其转换为 csv?
长答案(csvkit + csvtool)
输入
in2csv -f json
需要一个JSON 对象列表,因此您需要将单个对象 ( {...}
) 包装到方括号 ( [{...}]
) 中。
在 POSIX 兼容的 shell 上,写
echo "[$the_json]"
这将打印
[{
"whatever": 2342,
"otherwise": 119,
"and": 1,
"so": 2,
"on": 3
}]
csvkit 命令
您可以将上述数据直接通过管道传输到in2csv
. 但是,您可能会遇到 csvkit 的“<em>类型推断”(CSV 数据解释)功能的问题:
$ echo "[$the_json]" | in2csv -f json
无论如何,否则,并且,所以,在
2342,119,真,2,3
1
已成为True
。有关详细信息,请参阅文档的提示和故障排除部分。-I
建议使用以下选项关闭类型推断:
$ echo "[$the_json]" | in2csv -I -f json
无论如何,否则,并且,所以,在
2342,119,1,2,3
现在结果如预期
转置数据
不过,您需要转置数据。csvkit 文档说:
要转置 CSV,请考虑csvtool。
(csvtool
在github、opam、debian和可能的其他分发渠道上可用。)
使用 csvkit + csvtool,您的最终命令如下所示:
echo "[$the_json]" | in2csv -I -f json | csvtool transpose -
连字符 ( -
) 表示从中获取数据stdin
。这是结果:
whatever,2342
otherwise,119
and,1
so,2
on,3
而已。
我认为没有唯一的解决方案csvtool
,您需要in2csv
. 但是,您可以jq
改用,查看简短答案。
FTR,我正在使用 csvkit 版本1.0.3。