2016-11-29 18 views
0

現在、Rager 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"}] 

(2016年1月18日(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

最後のセクションが機能しました!あなたはそれを壊して、私は正確に何が起こっているか理解することができますか? –

関連する問題