2017-10-19 13 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)[])}) 

出力:

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

おかげで、それは働きます! 2番目の出力の場合、 ''データ ''を実行する方が簡単ではないでしょうか? – GrecKo

+0

ええ、あまりにも使用することができます。そして、もっと簡単になります! – hek2mgl

+0

ああ、そうです!削除されました。 – hek2mgl

1

は、ソートを回避する代わりにgroup_by/1peakGROUPS_BYを使用するソリューションは、次のとおりです。

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

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