jq:映射不同长度的字段数组

jq: map field array with different length

我正在与那些 JSON 合作:

{
  "extension": [
    {
      "url": "url1",
      "system": "system1"
    },
    {
      "url": "url2",
      "system": "system2"
    }
  ]
}
{
  "extension": [
    {
      "url": "url3",
      "system": "system3"
    }
  ]
}

如您所见,两个 JSON 对象都有不同的 .extension 长度。

我正在使用此命令来映射输入 JSONs:

jq --raw-output '[.extension[] | .url, .system] | @csv'

您可以找到 jqplay here.

我明白了:

"url1","system1","url2","system2"
"url3","system3"

我想得到的是:

"url1","system1","url2","system2"
"url3","system3",,

关于如何“正确”映射这些“字段”有什么想法吗?

使用 transpose | transpose 翻转 table 两次,用 null:

填充未装配的方形中缺少的槽
jq -rs 'map(.extension) | transpose | transpose[] | map(.url, .system) | @csv' 
"url1","system1","url2","system2"
"url3","system3",,

Demo

一个相当有效的解决方案:

def pad:
  (map(length)|max) as $mx
  | map( . + [range(length;$mx)|null] );

[inputs | [.extension[] | (.url, .system)]]
| pad[]
| @csv

这当然应该与 -n 命令行选项一起使用。