2017-10-19 16 views
1

J'ai un tableau d'objets et je veux supprimer des doublons dans ce tableau, je veux garder le nombre de doublons si.Compter et supprimer les doublons dans jq

Mon entrée est:

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

(pas sûr s'il est important, mais l'unicité d'un objet est basé sur foo et bar, non baz

Un exemple de sortie désirée serait alors.:

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

ou même:

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

Je sais comment faire la partie unicité (avec unique_by([.foo, .bar])) mais pas la partie de comptage.

Répondre

1

Vous pouvez utiliser la commande suivante en fonction de group_by:

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

Sortie:

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

L'autre sortie que vous avez mentionné peut être atteint avec cette commande:

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

sortie :

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

Merci, ça marche! Pour la deuxième sortie, ne serait-il pas plus simple de faire des "données": d'abord? – GrecKo

+0

Oui, peut être utilisé aussi. Et serait plus simple! – hek2mgl

+0

Oh oui! Supprimé – hek2mgl

1

Voici une solution qui utilise au lieu de GROUPS_BYpeak de group_by/1 pour éviter le tri:

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

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