减少对象流对我不起作用

reduction of stream of object does not work for me

我写了几个缩减,其中我有数组开始。但是如果我尝试读取原始数据并将每一行转换为对象,我就没有太多运气将它们一起减少

echo -e "1\n2\n\n\n3\n4\n5" | jq --raw-input '. | select (. != "") | {(.):123} | reduce . as $i ({}; . + $i)'

减少没有任何作用。为什么?如何更正缩减以生成具有键 1、2、3、4、5 的单个对象?

你快到了。要从多个结果转换为单个对象,您可以在 slurp 模式下 运行 另一个 jq

echo -e "1\n2\n\n\n3\n4\n5" \
| jq --raw-input 'select (. != "") | {(.):123}' \
| jq --slurp 'reduce .[] as $o ({}; . + $o)'

首先,开头的.|是不必要的。

其次,由于您的输入是一个流,您将需要使用 -s 选项,或者更好地使用 -n 选项和 inputs

所以你可以选择:

echo -e "1\n2\n\n\n3\n4\n5" | 
  jq -nR 'reduce (inputs|select(. != "")) as $i ({}; . + {($i): 123})'

虽然 {($i): null} 可能更合适。