jq: error: number and object cannot be subtracted

jq: error: number and object cannot be subtracted

我正在使用 jq 1.4 并且对以下情况感到困惑。我可以计算一个数字,但是当我尝试用这个数字构造一个对象时出现错误:

echo '{"aggregations":{"sent":{"value":25},"bounced":{"value":null},"incoming_act":{"value":25}}}' |
  jq '.aggregations
      | {"num_sent": .sent.value, "num_incoming_act": .incoming_act.value }
      | .num_sent as $x
      | .num_incoming_act as $y
      | $y-$x as $d
      | $d'
0

工作正常。但是

echo '{"aggregations":{"sent":{"value":25},"bounced":{"value":null},"incoming_act":{"value":25}}}' |
  jq '.aggregations
      | {"num_sent": .sent.value, "num_incoming_act": .incoming_act.value }
      | .num_sent as $x
      | .num_incoming_act as $y
      | $y-$x as $d
      | {diff: $d}'
jq: error: number and object cannot be subtracted

不起作用。当我在最后一部分请求对象时也会发生同样的情况:

echo '{"aggregations":{"sent":{"value":25},"bounced":{"value":null},"incoming_act":{"value":25}}}' |
  jq '.aggregations
      | {"num_sent": .sent.value, "num_incoming_act": .incoming_act.value }
      | .num_sent as $x
      | .num_incoming_act as $y
      | $y-$x as $d 
      | objects'
jq: error: number and object cannot be subtracted

我喜欢jq的管道系统。但是,这里似乎发生了一些事情。我在第一个例子中得到的“0”是什么?好像不是一个正常的数字0。这又可以了:

jq -n ' 0 as $x | {diff: $x} '

这个

echo '{"aggregations":{"sent":{"value":25},"bounced":{"value":null},"incoming_act":{"value":12}}}' | jq '.aggregations | {"num_sent": .sent.value, "num_incoming_act": .incoming_act.value } | {diff:(.num_sent as $x | .num_incoming_act as $y | $y-$x as $d | $d)}'

将生产:

{
  "diff": -13
}

区别就在这里;

上一个:.num_sent as $x | .num_incoming_act as $y | $y-$x as $d | {diff: $d}'

现在:{diff:(.num_sent as $x | .num_incoming_act as $y | $y-$x as $d | $d)}'

您可以通过可视化差异来了解,其中 jq 正在处理事物。


在出现错误的示例中,写 ($y-$x) as $d 而不是 $y-$x as $d。在编写 (COMPOUND INFIX EXPRESSION) as $variable.

时,括号有时是必需的,并且始终是可取的

解释:

解析器处理以下形式的表达式:

3-2 as $d | EXPR

如:

3-(2 as $d | EXPR)

这意味着 3-2 as $d|$d 被解析为 3-(2 as $d|$d),其计算结果为 3-2。但是请注意,在这种情况下,$d 本身的值为 2.