2017-09-21 1 views
0

zu finden Ich habe 3 verschiedene Dateien. mongo.json, elastic.json, stripe.json.jq: Vergleichen von drei Dateien, um fehlende IDs in einem

Jeder hat eine Reihe von Clients und ich möchte die Länge dieser Arrays vergleichen, um zu überprüfen, ob sie die gleiche Anzahl von Kunden zur Vermeidung von Fehlern haben. Hier ist ein Beispiel für jede Datei:

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 
    } 
] 
} 

Mit dem folgenden Befehl, den ich die Länge jedes Arrays zu erhalten, aber ich don Ich weiß nicht, wie man diese Lengs für chec vergleicht k, wenn sie gleich sind oder nicht:

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

Ergebnis:

2 
2 
1 

Wie kann ich diese Ergebnisse vergleichen? Ich mag die folgende Ausgabe:

Falls sie die gleiche Länge:

Everyting is OK. 

Im entgegengesetzten Fall:

Missing customer [email protected] 

Die Kunden-ID: ist die E-Mail-.

Wie kann ich das tun?

+0

I reduziert habe die Datenmenge und erklärt ein wenig mehr, was ich will. – Lechucico

+0

Das ist jetzt definitiv viel besser. –

+0

Ich habe es gerade repariert. Danke trotzdem. – Lechucico

Antwort

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 
' 

... richtig aussendet:

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

@Lechucico, ... BTW, Ich habe dies bearbeitet, um keine Schlüssel aus der Ausgabe dict ohne Werte zu lassen. Hoffentlich macht das seine Ausgabe nützlicher (kann einfach mit '{}' verglichen werden, um zu sehen, ob es irgendwelche Probleme gibt). –

+0

Erstaunliche Arbeit, danke! – Lechucico

+0

Ich habe vergessen, es in der Frage hinzuzufügen. Ich habe zwei Kunden auf elastic.json, die ignoriert werden müssen. Wie kann ich diese beiden Kunden ignorieren? – Lechucico

0

Ist das möglich?

Ja, es gibt viele Möglichkeiten, beide Aufgaben zu erfüllen. Sie werden es wahrscheinlich am einfachsten finden, die drei Dateien separat im jq-Programm zu verfolgen. Dies kann auch auf verschiedene Arten geschehen, aber ich würde vorschlagen, mit der Option '--argfile NAME FILENAME' zu beginnen, eine für jede Datei ein Tripel.

Es ist nicht mich sofort klar, was Sie durch Ermittlung verstehen, die „Kunden“ fehlen, aber ich diesen hoffentlich hilfreichen Tipp lassen bieten:

Wenn A und B sind zwei JSON-Arrays, dann wird der Ausdruck (A - B) wird ein Array ausgeben, das die Elemente in A enthält, die nicht in B sind.

+0

Können Sie mir ein Beispiel zeigen? Ich meine Kunden, die zum Beispiel fehlen. Ich habe einen Kunden namens John auf mongoDB und dieser Typ muss auch auf elasticsearch sein. Ich möchte wissen, ob sich jeder in jedem Speicher befindet. Das Problem ist, dass jeder Speicher sein eigenes JSON-Format hat. – Lechucico

0

BEARBEITEN: Diese Antwort wurde geschrieben, bevor Lechucico die Beispieldaten vereinfachte und die Beziehungen zwischen den Objekten verdeutlichte. Das Folgende mag nur von oberflächlichem Interesse sein, da Charles eine gute Lösung für das überarbeitete Problem bereitgestellt hat.


Sie müssen Ihre Daten verstehen, bevor Sie damit fortfahren können.Mit einem Bericht beginnen konnte,

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

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

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

Wenn die oben genannten Filter in filter.jq ist dann der Befehl

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

produziert

__________________________________________________ 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"} 

Es ist ziemlich klar, dass es sich um verschiedene Arten von Objekten so Es gibt möglicherweise keine naheliegende Eins-zu-Eins-Beziehung zwischen ihnen, aber wenn Sie Ihre tatsächlichen Daten und Ihren Arbeitsablauf untersuchen, können Sie möglicherweise einen aussagekräftigeren Link entdecken.

Verwandte Themen