我试图让 jq 将 json 对象渲染为 tsv 格式。我遇到了一种使用键名称动态生成标头的方法。
我收到此错误:
对象 ({"version":...) 在 csv 行中无效
我猜测这是由于某些字段是数组:Installed和Latest。我怎样才能使其在这些领域发挥作用?另外,为什么我的输出包括\t?
电流输出:
"RELEASE\tINSTALLED\tLATEST\tOUTDATED\tDEPRECATED"
jq: error (at <stdin>:28): object ({"version":...) is not valid in a csv row
Run Code Online (Sandbox Code Playgroud)
期望的输出:
RELEASE INSTALLED LATEST OUTDATED DEPRACATED
test-app 1.0.0 2.0.0 true false
test-app2 3.0.0 3.5.0 true false
Run Code Online (Sandbox Code Playgroud)
杰克
cat test1.json | jq '[.[]| with_entries( .key |= ascii_upcase ) ] | (.[0] |keys_unsorted | @tsv), (.[]|.|map(.) |@tsv)'
Run Code Online (Sandbox Code Playgroud)
格式:
[
{
"release": "test-app",
"Installed": {
"version": "1.0.0",
"appVersion": ""
},
"Latest": {
"version": "2.0.0",
"appVersion": ""
},
"outdated": true,
"deprecated": false
},
{
"release": "test-app2",
"Installed": {
"version": "3.0.0",
"appVersion": ""
},
"Latest": {
"version": "3.5.0",
"appVersion": ""
},
"outdated": true,
"deprecated": false
}
]
Run Code Online (Sandbox Code Playgroud)
首先要做的就是让你的鸭子排成一排:
map({release, installed: .Installed.version, latest: .Latest.version, deprecated})
Run Code Online (Sandbox Code Playgroud)
现在标题很简单:
( .[0] | keys_unsorted | map(ascii_upcase))
Run Code Online (Sandbox Code Playgroud)
...并且使用 .[] 来获取值是安全的:
.[] | [.[]]
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
map({release, installed: .Installed.version, latest: .Latest.version, deprecated})
| ( .[0] | keys_unsorted | map(ascii_upcase)),
(.[] | [.[]])
| @tsv
Run Code Online (Sandbox Code Playgroud)
在Jq tsv error in format an array/object 的相关问题中,您需要在标题下添加一行破折号。
要自动生成这样的行,请参阅 如何使用 jq 将 JSON 字符串格式化为表?