我正在尝试转换一个看起来像这样的对象:
{
"123" : "abc",
"231" : "dbh",
"452" : "xyz"
}
对于看起来像这样的csv:
"123","abc"
"231","dbh"
"452","xyz"
我更喜欢使用命令行工具jq,但似乎无法弄清楚如何进行分配。我设法通过jq '. | keys' test.json
获取密钥,但无法确定下一步该做什么。
问题是你无法将这样的k:v对象直接转换为带有@csv
的csv。它需要是一个数组,所以我们需要先转换为数组。如果键被命名,那将很简单,但它们是动态的,所以它不那么容易。
答案 0 :(得分:41)
试试这个过滤器:
to_entries[] | [.key, .value]
to_entries
将对象转换为键/值对象数组。 []
将数组拆分为数组中的每个项目这会产生以下输出:
[
"123",
"abc"
],
[
"231",
"dbh"
],
[
"452",
"xyz"
]
然后,您可以使用@csv
过滤器将行转换为CSV行。
$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"
答案 1 :(得分:4)
这是我今天早上使用的一个例子(处理PagerDuty警报):
cat /tmp/summary.json | jq -r '
.incidents
| map({desc: .trigger_summary_data.description, id:.id})
| group_by(.desc)
| map(length as $len
| {desc:.[0].desc, length: $len})
| sort_by(.length)
| map([.desc, .length] | @csv)
| join("\n") '
这会转储一个CVS分隔的文档,其外观如下所示:
"[Triggered] Something annoyingly frequent",31
"[Triggered] Even more frequent alert!",35
"[No data] Stats Server is probably acting up",55
答案 2 :(得分:1)
杰夫回答是一个很好的起点,更接近你的期望:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))'
[
"123,abc",
"231,dbh",
"452,xyz"
]
但是没有找到使用换行符加入的方法:
cat input.json | jq 'to_entries | map([.key, .value]|join(","))|join("\n")'
"123,abc\n231,dbh\n452,xyz"
答案 3 :(得分:0)
试试这个 提供你想要的相同输出
☺
答案 4 :(得分:-3)
onecol2txt () {
awk 'BEGIN { RS="_end_"; FS="\n"}
{ for (i=2; i <= NF; i++){
printf "%s ",$i
}
printf "\n"
}'
}
cat jsonfile | jq -r -c '....,"_end_"' | onecol2txt