JSON PARSING:条件提取键,如果为空,则回退到其他键

JSON PARSING:条件提取键,如果为空,则回退到其他键

我是 JSON 和jq.

我有以下 JSON 文档:

{
  "initial": [
    {
      "HIGH": null,
      "LOW": "XXX",
      "LARGE": "yyy",
      "variant": "MAIN"
    },
    {
      "HIGH": "ACE",
      "LOW": "XXX",
      "LARGE": "yyy",
      "variant": "Loren"
    }
  ]
}

我的代码:

jq -r '.initial[] | {Rank: .HIGH, Name: .variant} | join(",")'

输出:

,MAIN
ACE,Loren

预期输出:

yyy,MAIN
ACE, Loren

如果HIGHnull,则回退到LARGE,如果也是null,则回退到LOW

另外,如果variant是则null则使用默认值MAIN

有人可以帮我吗?

从我尝试过的一些教程中:

jq -r '.initial[] | {Rank: (map(if (.HIGH == null or .HIGH == "null" or .HIGH == "") then .LARGE else .HIGH end)), Name: .variant}'

但这给了我一个错误:

jq: error (at <stdin>:16): Cannot index string with string "HIGH"

答案1

你要//

jq '.initial[] | [.HIGH // .LARGE // .LOW, .variant // "MAIN"] | join(",")'

答案2

如果您想要输出的是一组带有标题的 CSV 记录,您可以通过首先传递标题,然后通过运算符传递数据来获得@csv

$ jq -r '[ "Rank", "Name" ], (.initial | map([.HIGH // .LARGE // .LOW, .variant // "MAIN"]))[] | @csv' file
"Rank","Name"
"yyy","MAIN"
"ACE","Loren"

这使用与 Glenn 使用类似的表达式来提取数据在他们的回答中,但是使用 map()(因为我喜欢map()并且你似乎也想在尝试中使用它)。

相关内容