如果没有其他JSON JQ

use*_*872 21 json if-statement jq

我使用以下JQ命令来过滤掉JSON.我的要求是在预期节点存在时过滤掉JSON消息.否则,什么都不做.因此,我使用if,elif,....

sed -n "s/.*Service - //p" $1/response.log* |
  jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
      elif (.result | length ) != 0  then .result |= map(select(.id== \"123\")) 
      else " "  end" > ~/result.log
Run Code Online (Sandbox Code Playgroud)

看起来在这里是必须的.我不想在else块中做任何事情.无论如何,我可以忽略其他或只是在其他地方打印一些whitespce.

在上面的例子中,它在结果文件中打印双引号"".

pea*_*eak 37

你可能想用这个成语:

if CONDITION then WHATEVER else empty end
Run Code Online (Sandbox Code Playgroud)

empty是一个根本不输出任何东西的过滤器 - 甚至不是null,这毕竟是一些东西(即JSON值).它有点像黑洞,只有黑色 - 它将消耗它提供的任何东西,但不像黑洞,它甚至不会发出霍金辐射.

在你的情况下,你有一个"elif"所以使用"else empty"可能是你想要的,但作为参考,上面完全等同于:

select(CONDITION) | WHATEVER
Run Code Online (Sandbox Code Playgroud)

PS我的猜测是,无论sed命令的目标是什么,它都可以作为jq程序的一部分更可靠地完成,也许使用walk/1.


Jef*_*ado 7

由于您没有对对象进行任何进一步的更改,因此只需使用“身份”过滤器.

if (.requests | length) then ... else . end
Run Code Online (Sandbox Code Playgroud)

在另一方面,你只是在更新requestsresult在非空时使用属性map。检查是没有必要的。如果它是空的,那么它将返回空。

您可以将过滤器简化为:

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))
Run Code Online (Sandbox Code Playgroud)