如何使用 JQ 1.4 将复杂的 JSON 转换为 CSV
How to convert complex JSON to CSV using JQ 1.4
我在 Windows 64 位机器上使用 JQ 1.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"
}
]
}
]
}
文件包含两个 "results"
。第一个结果包含 2 家公司的信息: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"
有人可以指导我在不对索引值进行硬编码的情况下编写脚本吗?
脚本应该能够为任意数量的 results
和任意数量的公司的每个包含信息生成输出。
我尝试使用以下未生成预期输出的脚本:
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
).
我在 Windows 64 位机器上使用 JQ 1.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"
}
]
}
]
}
文件包含两个 "results"
。第一个结果包含 2 家公司的信息: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"
有人可以指导我在不对索引值进行硬编码的情况下编写脚本吗?
脚本应该能够为任意数量的 results
和任意数量的公司的每个包含信息生成输出。
我尝试使用以下未生成预期输出的脚本:
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
).