使用jq将json映射转换为csv

时间:2015-08-19 04:32:06

标签: bash jq

输入

HTMLElement

期望的输出

{"key1": ["value1", "value2"], "key2": ["value3"]}

很难搞清楚jq命令来实现这个目标...我已经尝试过map,as,to_entries以各种组合过滤但没有运气。

3 个答案:

答案 0 :(得分:3)

我删除了JSON对象周围的额外括号对,以使其成为有效的JSON。所以,从这开始:

{
  "key1": [ "value1", "value2" ],
  "key2": [ "value3" ]
}

我们应用to_entries,它为我们提供了这个:

[
  {
    "key": "key1",
    "value": [ "value1", "value2" ]
  },
  {
    "key": "key2",
    "value": [ "value3" ]
  }
]

然后,我们map每个条目,我们传播([].value数组,为其每个元素(map({key, value: .value[]}))创建一个单独的对象。这给了我们:

[
  {
    "key": "key1",
    "value": "value1"
  },
  {
    "key": "key1",
    "value": "value2"
  },
  {
    "key": "key2",
    "value": "value3"
  }
]

之后,对于每个对象,我们需要一个包含其值的数组,因为这是@csv过滤器所期望的。这只是映射到数组对象,如map([.key, .value]),它给出了我们:

[
  [ "key1", "value1" ],
  [ "key1", "value2" ],
  [ "key2", "value3" ]
]

最后,我们传播([])数组数组(因为@csv需要单个数组),我们将@csv传递给它。完整的脚本如下所示:

jq -r 'to_entries | map({key, value: .value[]}) | map([.key, .value])[] | @csv' test.json

及其输出:

"key1","value1"  
"key1","value2"  
"key2","value3"

答案 1 :(得分:1)

您可以跳过构建行的几个步骤。

$ jq -r 'to_entries[] | { key, value: .value[] } | [ .key, .value ] | @csv'

在jq 1.5中,您可以使用新的combinations过滤器来生成键和值的组合。

$ jq -r 'to_entries[] | [ [.key], .value ] | combinations | @csv'

答案 2 :(得分:0)

这是一个简短的解决方案,仅使用jq&#39 []运算符和\()字符串插值。与jq -r标志一起使用以避免最终输出中的额外引号。

  . as $v
| keys[]
| "\(.), \($v[.][])"