2016-10-19 4 views
0

JSON 데이터를 만족 둥지 개체 값을 계산은 : 많은 학생들이 각 시험, 점수> X를 달성하는 방법JQ : 조건

{testId: '1' studentId:{'s1':{score: 20} 's2':{score: 80}}} 
{testId: '2' studentId:{'s1':{score: 60} 's2':{score: 70}}} 
{testId: '3' studentId:{'s5':{score: 40} 's7':{score: 30}}} 
... 

내가 말해 JQ를 사용하고 싶습니다. 상기 입력에 따라서

이고, x = 50, 출력 :

{testId: '1' numStudents:1} 
{testId: '2' numStudents:2} 
{testId: '3' numStudents:0} 

제가

{testId, studentId: .studentId[]?} | select(.studentId.score>50) 

이 각 테스트에서> 50 달성 모든 학생의 목록을 생성 할 수 오전 명령은 각 객체가 testId, studentId 및 score를 포함하는 객체 목록을 만듭니다. 여기서 모든 점수는 50보다 큽니다. 그러나 원하는 출력으로 이러한 결과를 재결합하는 방법을 알지 못합니다.

답변

4

다음은 입력이 유효한 JSON 객체의 스트림으로 구성된다고 가정합니다.

하나의 접근법은 add 사용하는 것이다 (정정이 이루어진 후에) 주어진 입력에

$ jq '{testId, numStudents: ([select(.studentId[].score > 50) | 1] | add // 0)}' 

를 출력 할 것이다 :

{ "testId": "1", "numStudents": 1 } { "testId": "2", "numStudents": 2 } { "testId": "3", "numStudents": 0 }

대안을 사용하는 것 length

{testId, 
numStudents: ([select(.studentId[].score > 50) ] | length)} 

그러나 (이 중간 배열의 건설을 포함하지 않기 때문에 예를 들어) 다음과 같은 라인을 따라 할 것 '데프', 다음 최고의 솔루션을 추가 괜찮다면 :

이 필터
def count(s): reduce s as $i (0; .+1); 

{testId, numStudents: count(select(.studentId[].score > 50))}