JQ - 格式化JSON数组,将值附加到特定的值

时间:2017-03-06 18:33:56

标签: json bash jq

我想要得到这个:

[   
    ["John Black",[ 
        ["Lorem ipsum dolor sit amet.",27], 
        ["Ut tempus lectus ut mi.",23]
    ]],
    ["Peter Pan",[ 
        ["Quisque pulvinar odio.",22],
        ["Nec ut lorem quis interdum elit.",32]
    ]],
    ["Gary Halbert",[ 
        ["Placerat aliquam.",17]
    ]],
    ["Richard Gere",[ 
        ["Porttitor commodo fermentum.",28]
    ]]
]

直到现在,这就是我得到的:

export A=$(cat <<'EOL'
[
["John Black",["Lorem ipsum dolor sit amet.",27]],
["Peter Pan",["Quisque pulvinar odio.",22]],
["John Black",["Ut tempus lectus ut mi.",23]],
["Gary Halbert",["Placerat aliquam.",17]],
["Peter Pan",["Nec ut lorem quis interdum elit.",32]],
["Richard Gere",["Porttitor commodo fermentum.",28]]
]
EOL
)
echo "$A" | jq 'map({(.[0]): .[1]}) | add'

结果:

{
  "John Black": [
    "Ut tempus lectus ut mi.",
    23
  ],
  "Peter Pan": [
    "Nec ut lorem quis interdum elit.",
    32
  ],
  "Gary Halbert": [
    "Placerat aliquam.",
    17
  ],
  "Richard Gere": [
    "Porttitor commodo fermentum.",
    28
  ]
}

我正在使用jq-1.5。 有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

这是减速器的合适用例。下面的大多数内容与加入共享密钥下的项目有关,而不是将它们转换为所需的嵌套列表形式:

jq -n '[
  inputs |
  reduce .[] as $item ({}; .[$item[0]] += [$item[1]]) |
  to_entries |
  .[] |
  [.key, .value]
]' <<<"$A"

...作为输出产生(仅针对空格编辑紧凑性):

[
  ["John Black", [["Lorem ipsum dolor sit amet.", 27], ["Ut tempus lectus ut mi.",23]]],
  ["Peter Pan", [["Quisque pulvinar odio.",22], ["Nec ut lorem quis interdum elit.", 32]]],
  ["Gary Halbert", [["Placerat aliquam.", 17]]],
  ["Richard Gere", [["Porttitor commodo fermentum.", 28]]]
]

答案 1 :(得分:0)

Couchdb引擎只是附加,这意味着每个文档都会被Couchdb附加到文件管理器中,并且每个文件都与数据库相关。

要正确使用,请考虑如何避免同一文档中的更新,请记住所有修订都将是存储。

我对每个文件的建议。

{
  "name": "John Black",
  "entries": [
    {
      "test": "Lorem ipsum dolor sit amet.",
      "value": 27
    }, 
    {
       "text": "Ut tempus lectus ut mi.",
       "value": 23
    }
  ],
  "type": "user"
}