如何使用JQ1.4将复杂的JSON转换为CSV

如何使用JQ1.4将复杂的JSON转换为CSV,json,jq,Json,Jq,我正在Windows 64位计算机上使用JQ1.4 下面是输入文件IP.txt { "results": [ { "name": "Google", "employees": [ { "name": "Michael", "division": "Engineering" }, { "name": "Laura", "division

我正在Windows 64位计算机上使用JQ1.4

下面是输入文件
IP.txt

{
  "results": [
    {
      "name": "Google",
      "employees": [
        {
          "name": "Michael",
          "division": "Engineering"
        },
        {
          "name": "Laura",
          "division": "HR"
        },
        {
          "name": "Elise",
          "division": "Marketing"
        }
      ]
    },
    {
      "name": "Microsoft",
      "employees": [
        {
          "name": "Brett",
          "division": "Engineering"
        },
        {
          "name": "David",
          "division": "HR"
        }
      ]
    }
  ]
}

{
  "results": [
    {
      "name": "Amazon",
      "employees": [
        {
          "name": "Watson",
          "division": "Marketing"
        }
      ]
    }
  ]
}
文件包含两个
“结果”
。第一个结果包含两家公司的信息:
Google
Microsoft
。第二个结果包含
Amazon
的信息。 我想将这个JSON转换成带有公司名和员工名的csv文件

"Google","Michael"
"Google","Laura"
"Google","Elise"
"Microsoft","Brett"
"Microsoft","David"
"Amazon","Watson"
我能写出以下脚本:

jq -r "[.results[0].name,.results[0].employees[0].name]|@csv" IP.txt

"Google","Michael"

"Amazon","Watson"
有没有人能指导我在不硬编码索引值的情况下编写脚本

脚本应该能够为任意数量的
结果
以及任意数量公司的每个包含信息生成输出

我尝试使用以下未生成预期输出的脚本:

jq -r "[.results[].name,.results[].employees[].name]|@csv" IP.txt
"Google","Microsoft","Michael","Laura","Elise","Brett","David"
"Amazon","Watson"

您需要首先将结果平铺到公司和员工姓名的行中。然后,您可以将其转换为csv行

map(.results | map({ cn: .name, en: .employees[].name } | [ .cn, .en ])) | add[] | @csv

因为您有一个输入流,所以您必须将它吸进(
-s
)。由于您想要输出csv,所以您需要使用原始输出(
-r
)。

谢谢您,杰夫。这很有效。你能告诉我在哪里可以学习JQ来理解这个脚本是如何工作的吗?我看了JQ手册。它有助于单个过滤器。我想学习如何将它们混合在一起,创造出神奇的解决方案。我能给你的最好建议是了解所有可用的过滤器,了解它们的用途和使用方法。请注意过滤器作为类型生成的内容,是单个值(数字、对象、数组等)还是多个值(使用[]),以及它们如何影响最终结果。有函数式编程或其他声明式编程风格的丰富背景者优先。只要玩玩它,它就会在你身上生长。也许几个月前我才发现这一点,但在这段时间内,我觉得我已经学会了做任何事情。