从 JQ 中的外部文件查找 ID

Ken*_*Ken 5 json jq

我有一个查找文件,将 ID 从一个系统映射到另一个系统:

[
  {
    "idA": 2547,
    "idB": "5d0bf91d191c6554d14572a6"
  },
  {
    "idA": 2549,
    "idB": "5b0473f93d4e53db19f8c249"
  },
  {
    "idA": 2550,
    "idB": "5d0bfabc8f20917b92ff07dc"
  },
...
Run Code Online (Sandbox Code Playgroud)

我有一个数据文件,其中包含来自以下系统之一的值和 ID:

[
  {
    "idB": "5d0bf91d191c6554d14572a6",
    "description": "Description for 5d0bf91d191c6554d14572a6"
  },
  {
    "idB": "5d0bf49e9236c57281811cfc",
    "description": "Description for 5d0bf49e9236c57281811cfc"
  },
  {
    "idB": "5d0bfabc8f20917b92ff07dc",
    "description": "Description for 5d0bfabc8f20917b92ff07dc"
  },
...
Run Code Online (Sandbox Code Playgroud)

我想生成一个新的描述文件,并将其 ID 转换为idA查找文件中的值。我试过这个:

jq --slurpfile idmap ids.json 'map( {"description":.description, "id": (.idB as $b|$idmap[][]|select(.idB==$b)|.idA) } )' descriptions.json
Run Code Online (Sandbox Code Playgroud)

但它只产生一个空数组。

我必须双重取消引用,$idmap因为slurping一个文件“将解析的JSON值的数组绑定到给定的全局变量”——所以这样做$idmap[]会抛出一个错误,jq:错误(在descriptions.json:70):无法索引数组字符串“idB”。

谁能解释我在这里做错了什么?

pea*_*eak 4

这是针对上述问题的简洁明了的解决方案。

为简单起见,我们首先使用以下方法构建包含相关映射的字典INDEX/2:

INDEX($idmap[]; .idB) | map_values(.idA)
Run Code Online (Sandbox Code Playgroud)

现在任务很简单:

(INDEX($idmap[]; .idB) | map_values(.idA)) as $dict
| map( {description, "idA": $dict[.idB] } )
Run Code Online (Sandbox Code Playgroud)

这假设调用使用 --argfile idmap ids.json 来避免由 --slurpfile 引起的不需要的“slurping”,但如果使用后者,那么您将$idmap[][]按照原始问题中的说明使用。

由于示例片段不包含任何匹配的“idB”值,因此显示使用这些片段获得的输出没有什么意义。

变化

如果 中的对象descriptions.js具有应保留的其他键,那么以下变体可能是更有用的指南:

(INDEX($idmap[]; .idB) | map_values(.idA)) as $dict    # or $idmap[][] as above
| map( .idA = $dict[.idB] | del(.idB) )
Run Code Online (Sandbox Code Playgroud)