【问题标题】:jq: flip or transpose to dict objectjq:翻转或转置到 dict 对象
【发布时间】:2022-01-27 21:46:29
【问题描述】:

这是我的文件:

{
   "id":"06b6751f-5125-4e48-b588-fcc8ff56004f",
   "dni":"78081181"
}
{
   "id":"4bdcf9e9-4a3e-4e13-963d-1270b94955dc",
   "dni":"77834021"
}

我需要得到:

{
"78081181": "06b6751f-5125-4e48-b588-fcc8ff56004f",
"77834021": "4bdcf9e9-4a3e-4e13-963d-1270b94955dc"
}

有什么想法吗?

【问题讨论】:

  • 输入中的两个对象之间没有逗号?
  • @choroba 是的,这是一个有效的对象流。它之间不会有逗号(除非也用括号括起来,这将使它成为一个数组)。

标签: json stream jq transpose


【解决方案1】:

每个对象都可以使用{ (.value) : (.key) } 公式进行转换。使用-s将所有对象读取到一个数组中,使用add将所有对象合并为一个。

jq  -s '[ .[] | { (.dni) : (.id) } ] | add' doc.json

【讨论】:

    【解决方案2】:

    如果输入文件完全适合您的记忆,请使用--slurpreduce

    jq --slurp 'reduce .[] as $k ({}; .[$k.dni] = $k.id)'
    
    {
      "78081181": "06b6751f-5125-4e48-b588-fcc8ff56004f",
      "77834021": "4bdcf9e9-4a3e-4e13-963d-1270b94955dc"
    }
    

    Demo

    【讨论】:

      【解决方案3】:

      将内存需求减少到最低限度(至少在 jq 范围内):

      jq -n 'reduce inputs as $in ({}; . + ($in | {(.dni): .id}))' input.jstream
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        相关资源
        最近更新 更多