2016-11-29 4 views
0

현재 REST API를 통해 PagerDuty에서 발생한 문제 목록을 얻으려고하고 있습니다. which returns them in JSON array. incident_key에 unique_by()를 사용하여 중복 이벤트를 제거하고 싶습니다. 그러나 나는 incident_key의 첫 번째 발생을 원하고 unique_by()는 마지막을 제외한 모든 것을 제거합니다.jq unique_by - 남은 요소를 선택하십시오.

[ 
{ "reference_key":"200", "id":"1" }, 
{ "reference_key":"200", "id":"2" }, 
{ "reference_key":"200", "id":"3" }, 
{ "reference_key":"201", "id":"4" }, 
{ "reference_key":"201", "id":"5" }, 
{ "reference_key":"201", "id":"6" } 
] 

가 난 할 노력하고있어 사용중입니다 : 내가 가지고있는 경우 지금, 849, 850, 851, 같은 incident_key 모든 incident_number, unique_by()는 851

간단한 예를 반환합니다 unique_by()는 id에 따라 reference_key의 첫 번째 항목을 가져옵니다. 이 경우 그래서, 내가 출력이

[ 
{ "reference_key":"200", "id":"1" }, 
{ "reference_key":"201", "id":"4" } 
] 

문제가 될 싶어하는 것은 나는이 통제 할 수 없으며, 데이터와 나는 현재,이 마지막 반환이 작업을 수행하기 위해 노력하고 있다는 것입니다 첫 번째 대신에 일어나는 일.

[ 
{ "reference_key":"200", "id":"3" }, 
{ "reference_key":"201", "id":"6" } 
] 

나는 reverse를 사용하고 unique_by()를 호출하려고했지만 동일한 결과가 나타납니다. 이것에 대한 어떤 통제 방법이 있습니까?

답변

1

jq 버전이 충분히 최신 버전이 아닌 경우 일 수 있습니다. JQ 1.5 사용 :

unique_by(.reference_key) 

[{"reference_key":"200","id":"1"},{"reference_key":"201","id":"4"}] 

산출 (헤세이 18, 2016 (7835a72)에있는 바와 같이, 내장 sort 필터가 안정하면, 그 전에 안정성 플랫폼 의존이었다.)

충분히 최신 버전의 jq에 액세스 할 수없는 경우 jq 1.3, 1.4 및 1.5로 테스트 한 다음을 고려하십시오.

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

bucketize(.reference_key) | .[][0] 

또는 훨씬 더 경제적으로는 :

reduce .[] as $x ({}; 
    $x.reference_key as $key 
    | if .[$key] then . else .[$key] = $x end) 
| .[] 
+0

나는이 시간을 작동 한 이후 내 예를 최고의 아니었다 가정합니다. 왜 그런지 잘 모르겠지만 배열의 경우 PagerDuty 사건 목록에서 현재 가져온 것은 마지막 사건을 선택합니다. 다음은 unique_by와 unique_by 사이의 차이점입니다. http://i.imgur.com/3vSuoYT.png –

+0

지난 절이 효과가있었습니다! 그게 무슨 일인지 정확히 이해할 수 있을까요? –