2017-09-21 3 views
0

J'ai 3 fichiers différents. mongo.json, elastic.json, stripe.json.jq: Comparer trois fichiers pour trouver des identifiants manquants dans un

Chacun a un tableau de clients et je veux comparer la longueur de ces tableaux pour vérifier s'ils ont le même nombre de clients pour éviter les erreurs. Voici un exemple de chaque fichier:

Mongo.json

[{ 
    "_id": { 
      "$oid": "59c3942baeef22b03fa573d2" 
    }, 
    "client_id": "[email protected]", 
    "name": "Windows Client" 
},{ 
    "_id": { 
      "$oid": "59c3942baeef22b03fa573d2" 
    }, 
    "client_id": "[email protected]", 
    "name": "Linux Client" 
}] 

elastic.json

[ 
    { 
     "alias" : "[email protected]", 
     "index" : "index1", 
     "filter" : "-" 
    }, 
    { 
     "alias" : "[email protected]", 
     "index" : "index2", 
     "filter" : "-" 
    } 
] 

stripe.json

{ 
"object": "list", 
"data": [ 
    { 
     "id": "[email protected]", 
     "object": "customer", 
     "account_balance": 0, 
     "created": 1505990903 
    } 
] 
} 

Avec la commande suivante j'obtenir la longueur de chaque tableau, mais je ne Je ne sais pas comment comparer ces mots pour chec k si elles sont les mêmes ou non:

jq '. | length' mongo.json elastic.json stripe.json 

Résultat:

2 
2 
1 

Comment puis-je comparer ces résultats? Je voudrais que la sortie suivante:

Dans le cas où ils ont la même longueur:

Everyting is OK. 

En cas contraire:

Missing customer [email protected] 

L'ID client: est l'e-mail.

Comment je peux faire ça?

+0

J'ai réduit la quantité de données et expliqué un peu plus ce que je veux. – Lechucico

+0

C'est définitivement beaucoup mieux maintenant. –

+0

Je réparais tout de suite. Merci quand même. – Lechucico

Répondre

2
jq -n \ 
    --slurpfile mongo mongo.json \ 
    --slurpfile elastic elastic.json \ 
    --slurpfile stripe stripe.json \ 
' 
    [$mongo[][].client_id] as $mongo_ids 
| [$elastic[][].alias] as $elastic_ids 
| [$stripe[].data[].id] as $stripe_ids 
| (($mongo_ids + $elastic_ids + $stripe_ids) | unique) as $all_ids 
| {"missing_from_stripe": ($all_ids - $stripe_ids), 
    "missing_from_elastic": ($all_ids - $elastic_ids), 
    "missing_from_mongo": ($all_ids - $mongo_ids)} 
| [to_entries[] | select(.value|length > 0)] | from_entries 
' 

... correctement émet:

{ 
    "missing_from_stripe": [ 
    "[email protected]" 
    ] 
} 
+0

@Lechucico, ... btw, j'ai édité ceci pour laisser de côté toutes les touches de la sortie dict sans valeurs. Espérons que cela rende sa sortie plus utile (peut simplement se comparer à '{}' pour voir s'il y a des problèmes). –

+0

Un travail incroyable, merci! – Lechucico

+0

J'ai oublié de l'ajouter à la question. J'ai deux clients sur elastic.json qui doivent être ignorés. Comment puis-je ignorer ces deux clients ?? – Lechucico

0

Est-ce possible?

Oui, il existe plusieurs façons d'effectuer les deux tâches. Vous trouverez probablement le plus facile de garder une trace des trois fichiers séparément dans le programme jq. Cela peut aussi être fait de plusieurs façons, mais je suggère de commencer par l'option '--argfile NAME FILENAME', une triple pour chaque fichier.

Il est pas immédiatement clair pour moi ce que vous entendez en vérifiant que « les clients » manquent, mais laissez-moi vous offre cette astuce nous espérons utile:

Si A et B sont deux tableaux de JSON, l'expression (A - B) émettra un tableau contenant les éléments de A qui ne sont pas B.

+0

Pouvez-vous me montrer un exemple? Je veux dire les clients qui manquent, par exemple. J'ai un client qui s'appelle John sur mongoDB et ce mec doit aussi être sur elasticsearch. Je veux savoir s'il y a tout le monde sur chaque stockage. Le problème est que chaque stockage a son propre format json. – Lechucico

0

EDIT: Cette réponse a été écrite avant le Lechucico pour simplifier les données d'échantillon et clarifier les relations entre les objets. Ce qui suit peut n'avoir qu'un intérêt superficiel puisque Charles a fourni une bonne solution au problème révisé.


Vous devez comprendre vos données avant de pouvoir progresser dans ce domaine.Vous pourriez commencer par un rapport,

"__________________________________________________ mongo.json" 
, ($mongo[] | {client_id, name}) 

, "__________________________________________________ elastic.json" 
, ($elastic[] | {alias, index}) 

, "__________________________________________________ stripe.json" 
, ($stripe.data[] | {id, object}) 

Si le filtre ci-dessus est filter.jq alors la commande

jq -Mnc \ 
    --argfile mongo mongo.json \ 
    --argfile elastic elastic.json \ 
    --argfile stripe stripe.json \ 
    -f filter.jq 

produit

__________________________________________________ mongo.json 
{"client_id":"TEST","name":"Windows Client"} 
{"client_id":"TEST2","name":"Linux Client"} 
__________________________________________________ elastic.json 
{"alias":"living","index":"living_v1"} 
{"alias":"reindex","index":"living_v1"} 
__________________________________________________ stripe.json 
{"id":"cus_BRKuwUx0TS1LPL","object":"customer"} 

Il est assez clair que ce sont les différents types d'objets afin Il se peut qu'il n'y ait pas de relation un à un évidente entre eux, mais si vous analysez vos données et votre flux de travail, vous pourrez peut-être découvrir un lien plus significatif.