2017-09-21 4 views
0

3つのファイルがあります。 mongo.json,elastic.json,stripe.jsonjq:3つのファイルを比較して、いずれかの識別子が見つからない場合

それぞれにはクライアントの配列があり、それらの配列の長さを比較して、エラーを防ぐために同じ量の顧客を持っているかどうかを確認したいと思います。ここでは、各ファイルの例です:私は、各配列のな長さを取得し、次のコマンドで

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

は、私ドンchecのためにこれらのlengtsを比較する方法を知らない彼らは同じかでない場合Kは

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

結果:

2 
2 
1 

私は、これらの結果を比較することができますどのように?私は、次のような出力をしたいと思います:

Everyting is OK. 

反対の場合:場合

は、彼らが同じ長さを有し

Missing customer [email protected] 

顧客ID:は、電子メールです。

どうすればいいですか?

+0

を私はデータの量を削減し、より多くの私が欲しいものを少し説明してきました。 – Lechucico

+0

これは間違いなく現在ははるかに優れています。 –

+0

私は今それを修正していました。とにかくありがとう。 – Lechucico

答えて

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 
' 

...正しく発する:

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

@Lechucico、... btw、これを編集して、値のない出力dictのキーを除外しました。うまくいけば、その出力はより有用になります(問題があるかどうかを知るために '{}'と比較するだけでよいでしょう)。 –

+0

すばらしい仕事、ありがとう! – Lechucico

+0

質問に追加するのを忘れました。私はelastic.json上の2人の顧客を無視しなければなりません。どのように私はこれらの2つの顧客を無視することができますか? – Lechucico

0

これは可能ですか?

はい、両方のタスクを達成する方法はたくさんあります。おそらく、jqプログラム内で3つのファイルを別々に追跡するのが最も簡単でしょう。これもいくつかの方法で行うことができますが、私は '--argfile NAME FILENAME'オプションから始めることをお勧めします。

それはあなたが「顧客が」不足しているが、私はこのうまくいけば役に立つヒントを提供させている把握することによって何を意味するのか私にはすぐに明らかではない。そして、式(A、AとBの2つのJSON配列の場合

を - B)は、BにないAの項目を含む配列を出力します。

+0

私にいくつかの例を教えてもらえますか?たとえば、欠落している顧客を意味します。 mongoDBにJohnと呼ばれる顧客がいて、この男はelasticsearchにいる必要があります。私は各店舗に誰もがいるかどうかを知りたい。問題は、各ストレージに独自のjson形式があることです。 – Lechucico

0

EDIT:この回答はLechucicoの前に書かれており、サンプルデータが簡素化され、オブジェクト間の関係が明確になりました。 Charlesが改訂された問題の良い解決策を提供して以来、以下は大事なものに過ぎません。


これを進める前に、データを理解する必要があります。上記フィルタがfilter.jqである場合は、レポートで

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

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

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

を開始することができ、その後、コマンド

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

はそれはとてもこれらは、異なるタイプのオブジェクトであることをかなり明確だ

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

を生成しますそれらの間に明白な1対1の関係はないかもしれませんが、実際のデータとワークフローを調査すると、より意味のあるリンクを発見することができます。

関連する問題