2017-10-19 5 views
1

개체 배열이 있고이 배열에서 일부 복제본을 제거하고 싶습니다. 복제본 수를 유지하려고합니다.jq에서 중복을 계산하고 제거합니다.

내 입력은 다음과 같습니다

[ 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever" 
    }, 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "hello" 
    }, 
    { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world" 
    } 
] 

(것이 중요하지만 개체의 고유성 foobar하지 baz를 기반으로하는 경우 확실하지

원하는 출력의 예는 다음이 될 것입니다. :

[ 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever", 
     "count": 2 
    }, 
    { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world", 
     "count": 1 
    } 
] 

또는 :

[ 
    { 
     "count": 2, 
     "data": { 
      "foo": 1, 
      "bar": "a", 
      "baz": "whatever" 
     } 
    }, 
    ... 
] 

유일성 부분 (unique_by([.foo, .bar]) 포함)을 수행하는 방법을 알고 있지만 계산 부분은 아닙니다.

답변

1

당신은 group_by에 따라 다음 명령을 사용할 수 있습니다

group_by(.foo,.bar) 
| map(.[]+{"count":length}) 
| unique_by(.foo,.bar) 

출력 :

당신이 언급 한 다른 출력이 명령 달성 할 수
[ 
    { 
    "foo": 1, 
    "bar": "a", 
    "baz": "whatever", 
    "count": 2 
    }, 
    { 
    "foo": 1, 
    "bar": "b", 
    "baz": "world", 
    "count": 1 
    } 
] 

:

group_by(.foo,.bar) 
| map({"count":length,"data":(unique_by(.foo,.bar)[])}) 

출력 :

여기
+0

감사합니다, 그것은 작동! 두 번째 출력의 경우 "데이터"를 수행하는 것이 더 간단하지 않습니까? – GrecKo

+0

그래, 사용할 수 있습니다. 그리고 더 간단하게 될 것입니다! – hek2mgl

+0

오오 그렇습니다! 제거되었습니다. – hek2mgl

1

[ 
    { 
    "count": 2, 
    "data": { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever" 
    } 
    }, 
    { 
    "count": 1, 
    "data": { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world" 
    } 
    } 
] 
peakGROUPS_BY 대신 group_by/1의 정렬을 방지하기 위해 사용하는 솔루션입니다 :

def GROUPS_BY(stream; f): reduce stream as $x ({}; .[$x|f] += [$x]) | .[] ; 

    GROUPS_BY(.[]; {foo,bar}|tostring) 
| .[0].count = length 
| .[0]