2017-09-21 2 views
0

3 개의 다른 파일이 있습니다. mongo.json, elastic.json, stripe.json.jq : 누락 된 식별자를 찾기 위해 세 파일 비교

각 하나에는 클라이언트 배열이 있으며 이러한 배열의 길이를 비교하여 오류 방지를 위해 동일한 금액의 고객이 있는지 확인하려고합니다. 다음은 각 파일의 예이다 : 나는 각 배열의 아이폰에를 얻을 다음 명령을

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

고객 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에있는 두 고객을 무시해야합니다. 어떻게이 두 고객을 무시할 수 있습니까 ?? – Lechucico

0

가능합니까?

예, 두 가지 작업을 수행하는 방법은 다양합니다. jq 프로그램 내에서 세 파일을 따로 추적하는 것이 가장 쉽다. 이것 역시 여러 가지 방법으로 할 수 있지만 '--argfile NAME FILENAME'옵션으로 시작하는 것이 좋습니다. 각 옵션은 각 파일에 대해 하나씩 세 가지 옵션이 있습니다.

그것은 당신이 "고객"누락들을 확인하기로 의미하지만, 나이 희망 도움이 힌트를 제공 할 것을 나에게 즉시 분명하지 않다 :

A와 B 두 개의 JSON 배열, 다음 식 (A 인 경우 - 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 관계가 있지 않을지도 모르지만 당신이 당신의 실제적인 자료 및 작업 흐름을 조사하는 경우에 당신은 의미심장 한 연결을 발견 할 수 있을지도 모른다.