배열의 1:1 매핑으로 JSON으로 내보낸 SQL 결과 집합이 있습니다.
예를 들어
[
{
"subject": "Accounting",
"level": "A Level"
},
{
"subject": "Accounting",
"level": "IB"
},
{
"subject": "Accounting",
"level": "University"
},
{
"subject": "Accounting",
"level": "GCSE"
},
{
"subject": "Accounting",
"level": "Mentoring"
},
{
"subject": "Accounting",
"level": "13 Plus"
},
{
"subject": "Accounting",
"level": "11 Plus"
},
etc.....
다음과 같이 레벨을 주제 키로 결합하고 싶습니다.
[
"Accounting": ["A Level", "IB", "University"],
"Foo": ["Foo Intro", "Foo Basics", "Intermediate Foo"]
]
노트:익명 개체 없음
jq를 사용하여 이를 어떻게 달성할 수 있나요?
답변1
주어진
$ jq '.' file.json
[
{
"subject": "Accounting",
"level": "A Level"
},
{
"subject": "Foo",
"level": "IB"
},
{
"subject": "Accounting",
"level": "University"
},
{
"subject": "Foo",
"level": "GCSE"
},
{
"subject": "Accounting",
"level": "Mentoring"
},
{
"subject": "Accounting",
"level": "13 Plus"
},
{
"subject": "Foo",
"level": "11 Plus"
}
]
그럼 돈 많이 빌리세요요약 데이터를 사용하여 jq 배열 모양 변경
$ jq 'reduce .[] as $d (null; .[$d.subject] += [$d.level])' file.json
{
"Accounting": [
"A Level",
"University",
"Mentoring",
"13 Plus"
],
"Foo": [
"IB",
"GCSE",
"11 Plus"
]
}
참고: 외부 레이어는 배열이 아닌 개체입니다(예상 출력에서 볼 수 있듯이 유효한 JSON이 아닌 것 같습니다).
답변2
이 작업을 어떻게 수행할지 모르겠습니다 jq
. (저는 다음과 같은 단일 목적 도구를 배우는 것보다 Perl과 같은 범용 언어로 무언가를 작성하는 것이 더 쉽다고 생각합니다 jq
... json 데이터를 더 자주 사용하면 가치가 있을 수 있습니다.) 가장 기본적인 사용법보다 더 많은 것을 배울 시간입니다. 하지만 Perl을 사용하면 쉽습니다.JSON기준 치수.
#!/usr/bin/perl
use strict;
use JSON;
# hash-of-arrays to hold an array of "level"s for each "subject"
my %merged;
# slurp the input into scalar string variable $text
my $text; { local $/; $text=<> }
my $json = JSON->new->allow_nonref;
my $data = $json->decode($text); # parse json text into $data arrayref
# loop over each row of $data and insert into %merged
foreach my $row (@$data) {
my $key = $row->{subject};
my $val = $row->{level};
push @{ $merged{$key} }, $val;
};
# pretty-print %merged as json
print $json->pretty->encode(\%merged), "\n";
예제 출력:
$ ./merge-json.pl input.json
{
"Accounting" : [
"A Level",
"IB",
"University",
"GCSE",
"Mentoring",
"13 Plus",
"11 Plus"
],
"Foo" : [
"Foo Intro",
"Foo Basics",
"Intermediate Foo"
]
}
Debian, Ubuntu 등을 실행 중인 경우 다음 명령을 사용하여 JSON 모듈을 설치할 수 있습니다 sudo apt-get install libjson-perl libjson-xs-perl
(이렇게 하면 Perl 기본 버전이 설치되어야 함)그리고C 버전 모듈의 컴파일 속도가 빨라지고,JSON::XS). 다른 배포판에서도 작동할 수 있습니다. 그렇지 않으면 를 사용하여 설치하십시오 cpan
.
답변3
와는 다른 접근 방식스틸 드라이버키별로 데이터를 그룹화 subject
한 다음 level
해당 배열 아래의 모든 값을 수집하는 것입니다 subject
.
다음은 steeldriver와 동일한 테스트 데이터를 사용합니다.
$ jq 'group_by(.subject) | map({ (first.subject): map(.level) }) | add' file
{
"Accounting": [
"A Level",
"University",
"Mentoring",
"13 Plus"
],
"Foo": [
"IB",
"GCSE",
"11 Plus"
]
}
마지막으로 add
이전에 생성된 배열의 요소를 병합합니다 map()
.