减少对象流对我不起作用
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}
可能更合适。
我写了几个缩减,其中我有数组开始。但是如果我尝试读取原始数据并将每一行转换为对象,我就没有太多运气将它们一起减少
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}
可能更合适。