我有以下JSON数据:
{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}
如何使用jq将其转换为CSV格式,以便我的结果如下所示?
id,case,session Id,speech invoked,input method
111,Y,420,no,hard
我尝试了以下操作,但它不起作用:
{(.id),(.case),(.custom."session Id"),(.custom."speech invoked"),(.custom."input method")}
如果不可能,我们会感谢任何perl或shell解决方案。
答案 0 :(得分:21)
以Joe Harris为基础'回答,您可以使用@csv过滤器,以便在必要时正确引用和转义字符串:
jq -r '[.case, .custom."speech invoked", .custom."input method"] | @csv'
答案 1 :(得分:18)
使用perl对我来说不是一个好的解决方案,但经过一些试验和错误后我发现你可以使用jq
运算符只使用join()
。
首先创建所需输出的数组,然后使用逗号连接数组元素。
jq -r '[.case, .custom."speech invoked", .custom."input method"] | join(", ")'
享受。 :)
答案 2 :(得分:11)
使用jq,您可以使用此过滤器:
with_entries(select(.key != "custom")) + .custom
| to_entries
| map(.key), map(.value)
| @csv
请注意以这种方式书写," custom"无论属性的顺序如何,属性都将始终写在最后。
答案 3 :(得分:1)
这是另一种解决方案。如果data.json
包含示例数据,则
jq -M -s -r 'map(.+.custom|del(.custom)) | (.[0]|keys_unsorted), (.[]|[.[]]) | join(",")' data.json
将产生
id,case,speech invoked,input method,session ID
111,Y,no,hard,420
答案 4 :(得分:0)
使用Perl及其JSON模块:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use JSON;
my $input = << '__JSON__';
{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}
__JSON__
my $struct = decode_json($input);
my @header = grep ! ref $struct->{$_}, keys %$struct;
push @header, map keys %{ $struct->{$_} },
grep ref $struct->{$_},
keys %$struct;
my @row = grep ! ref, values %$struct;
push @row, map values %$_, grep ref, values %$struct;
say join ',', @header;
say join ',', @row;