我有一个查找文件,将 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”。
谁能解释我在这里做错了什么?
这是针对上述问题的简洁明了的解决方案。
为简单起见,我们首先使用以下方法构建包含相关映射的字典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)
| 归档时间: |
|
| 查看次数: |
729 次 |
| 最近记录: |