使用jq命令的输出作为另一个jq命令的args来比较两个json文件

fgw7neuy  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(101)

我想根据一个JSON文件的内容过滤另一个JSON文件。
我想提取第一个JSON文件data.json上的ID,使用以下jq:

jq '[.data[] | select(.attributes.closeReason == "Fraud")][:10] | [.[].relationships.customer.id]' data.json

这会产生类似于:

[
  "621506",
  "624722",
  "631044",
  "633359",
  "699327",
  "710710",
  "711493",
  "713413",
  "713824",
  "713903"
]

我想获取这些值并使用它们来匹配其他JSON的ID。
例如:

jq --argjson ids "$ARGS.positional[]" '.data[] | select(.id | IN($ids[]))' accounts.json

但我得到了错误:

jq: invalid JSON text passed to --argjson

我试过清除堆栈溢出,Phind.com,ChatGPT,但我还没有找到任何解决方案。

示例- JSON文件:

第一个JSON文件(提取客户ID)

[
  {
    "type": "depositAccount",
    "id": "991231",
    "attributes": {
      "name": "William Heckerd",
      "status": "Closed",
      "closeReason": "Fraud",
      "fraudReason": "ACHActivity",
      "updatedAt": "2023-02-24T19:41:30.224Z"
    },
    "relationships": {
      "customer": {
        "data": {
          "type": "customer",
          "id": "123456"
        }
      },
   }
  },
]
}

第二个JSON文件-根据客户ID过滤出来:

{
    "data": [
        {
            "type": "individualCustomer",
            "id": "567898765",
            "attributes": {
                "createdAt": "2023-09-10T08:32:07.921Z",
                "fullName": {
                    "first": "Foo",
                    "last": "Example"
                },
                "email": "[email protected]",
                "status": "Archived",
                "archiveReason": "FraudClientIdentified"
            }
            
        },
  ]
}
tsm1rwdh

tsm1rwdh1#

jq已经可以自己处理多个输入文件:

jq '
map(select(.attributes.closeReason == "Fraud") | .relationships.customer.data.id) as $ids
| input
| .data[]
| select(.id | IN($ids[]))
' accounts.json data.json

或者,如果你真的想调用jq的两个示例:

jq \
--argjson ids "$(jq 'map(select(.attributes.closeReason == "Fraud") | .relationships.customer.data.id)' accounts.json)" \
'.data[] | select(.id | IN($ids[]))' \
data.json

或者用一个中间变量:

ids="$(jq 'map(select(.attributes.closeReason == "Fraud") | .relationships.customer.data.id)' accounts.json)"
jq \
--argjson ids "$ids" \
'.data[] | select(.id | IN($ids[]))' \
data.json

相关问题