bash - 使用 jq 将 json 映射转换为 csv

标签 bash jq

输入

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

期望的输出

key1, value1
key1, value2
key2, value3

很难找出 jq 命令来实现此目的...我尝试过各种组合的 map、as、to_entries 过滤器,但没有成功。

最佳答案

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

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

我们应用to_entries,这给了我们这个:

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

然后,我们映射每个条目,并展开 ([]).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"

关于bash - 使用 jq 将 json 映射转换为 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086615/

相关文章:

json - 如何在jq中将整数作为参数?

json - 如何使用命令行计算 JSON 对象中的项目?

linux - 每秒显示运行 bash 脚本的运行时间

bash - 使用 awk 重复 CSV 中未知数量的第一列

mysql - bash脚本访问多个mysql数据库

json - 使用 jq reduce 汇总多个值

json - 使用shell动态添加json对象中的键值对

bash - 如何检索 aws Secretsmanager 的值?

bash - 如何在 macOS 上使用 gsed 将字符串替换为文件内容?

linux - 检查 rsync 的 CPU 使用率,如果超过阈值则终止