jq:比较三个文件以查找任何缺少的标识符

时间:2017-09-21 11:06:49

标签: jq

我有3个不同的文件。 mongo.jsonelastic.jsonstripe.json

每个客户端都有一组客户端,我想比较这些数组的长度,以检查它们是否具有相同数量的客户以防止错误。以下是每个文件的示例:

Mongo.json

[{
    "_id": {
            "$oid": "59c3942baeef22b03fa573d2"
    },
    "client_id": "test@test.com",
    "name": "Windows Client"
},{
    "_id": {
            "$oid": "59c3942baeef22b03fa573d2"
    },
    "client_id": "test2@test2.com",
    "name": "Linux Client"
}]

elastic.json

[
    {
        "alias" : "test@test.com",
        "index" : "index1",
        "filter" : "-"
    },
    {
        "alias" : "test2@test2.com",
        "index" : "index2",
        "filter" : "-"
    }
]

stripe.json

{
"object": "list",
"data": [
  {
      "id": "test@test.com",
      "object": "customer",
      "account_balance": 0,
      "created": 1505990903
  }
]
}

使用以下命令获取每个数组的长度,但我不知道如何比较这些长度以检查它们是否相同:

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

结果:

2
2
1

我如何比较这些结果?我想要以下输出:

如果它们具有相同的长度:

Everyting is OK.

相反的情况:

Missing customer test2@test2.com

客户ID:是电子邮件

我怎么能这样做?

3 个答案:

答案 0 :(得分: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": [
    "test2@test2.com"
  ]
}

答案 1 :(得分:0)

  

这可能吗?

是的,有很多方法可以完成这两项任务。您可能会发现在jq程序中分别跟踪这三个文件最容易。这也可以通过多种方式完成,但我建议从'--argfile NAME FILENAME'选项开始,每个文件一个三元组。

通过确定缺少哪些“客户”,我不能立即明白您的意思,但让我提供这个有希望的有用提示:

如果A和B是两个JSON数组,则表达式(A - B)将发出一个数组,其中包含A中不在B中的项目。

答案 2 :(得分:0)

编辑:这个答案是在Lechucico简化样本数据之前编写的,并澄清了对象之间的关系。以下可能只是粗略的兴趣,因为Charles为修订后的问题提供了一个很好的解决方案。

您需要先了解自己的数据,然后才能取得进展。你可以从报告开始,

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

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

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

如果上面的过滤器在filter.jq,那么命令

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

很明显,这些是不同类型的对象,因此它们之间可能没有明显的一对一关系,但如果您调查实际数据和工作流程,您可能会发现更有意义的链接。