JQ 仅在字段存在时创建字段

Hec*_*407 2 json key filter jq

在 jq 中,如何确保 ak,v 仅在被检查的对象中存在时才创建?例如,假设我有一个对象,如:

{
 "student":{
    "name": "george",
    "age" : "15",
    "quote": "Hello I am George"
    }
 }
Run Code Online (Sandbox Code Playgroud)

我这样做是cat text.txt | jq '{name: .student.name, quote: .student.quote}' 为了创造:

  {
   "name": "george",
   "quote": "Hello I am George"
   }
Run Code Online (Sandbox Code Playgroud)

但是,有些条目不完整,我不想写一个空的K,V。假设我得到:

{
 "student":{
    "name": "Shirley"
  }
} 
Run Code Online (Sandbox Code Playgroud)

使用上面的当前 jq 这将创建:

 {
  "name": "Shirley",
  "quote": " ",
  }
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉 jq 只在'quote'它存在(即不为空)时才创建密钥?或者更一般地说,只有当它们存在于被检查的对象中时才创建所有键。

pea*_*eak 6

这是对象添加非常方便的地方,特别是因为$obj + null产量$obj(如果$obj是 JSON 对象):

.student |  {name} + if has("quote") then {quote} else null end
Run Code Online (Sandbox Code Playgroud)

或等效地:

def maybe(k): if has(k) then {(k): .[k]} else null end;
.student |  {name} + maybe("quote")
Run Code Online (Sandbox Code Playgroud)

一种略有不同的方法,语义略有不同,是:

.student |  {name} + ((select(.quote) | {quote}) // null)
Run Code Online (Sandbox Code Playgroud)

当然,其他变化也是可能的。