Bash 仅当对象与上一个使用jq的元素不同时才选择该对象
目标是仅当对象的值与前一个对象不同时才打印该对象 想象一下这个json:Bash 仅当对象与上一个使用jq的元素不同时才选择该对象,bash,jq,Bash,Jq,目标是仅当对象的值与前一个对象不同时才打印该对象 想象一下这个json: [ { "date": "10-03-20", "value": 3 }, { "date": "11-03-20", "value": 3 }, { "date": "12
[
{
"date": "10-03-20",
"value": 3
},
{
"date": "11-03-20",
"value": 3
},
{
"date": "12-03-20",
"value": 3
},
{
"date": "13-03-20",
"value": 8
},
{
"date": "14-03-20",
"value": 8
},
{
"date": "15-03-20",
"value": 5
}
]
预期产出应为:
[
{
"date": "10-03-20",
"value": 3
},
{
"date": "13-03-20",
"value": 8
},
{
"date": "15-03-20",
"value": 5
}
]
仅当值
与上一个对象不同时才打印对象
这就是我开始对jq所做的:
[foreach .[] as $row (null;
select($row.value != $lastValue) | $row.value
$lastValue = $row.value
)]
当然,这是行不通的,我不能像这样在jq中使用variable,我不知道这是否是一个好方法。在这里使用
reduce
可能比使用foreach
更容易:
reduce .[] as $x (null;
if . == null then [$x]
elif .[-1].value == $x.value then .
else . + [$x] end)
使用foreach的解决方案
作为参考,这里有一个使用foreach
的解决方案。关键思想是使用foreach的state变量来存储您可能在另一种语言中使用的“局部变量”
[ foreach .[] as $x ({};
if .prev == $x.value then .emit = null
else {prev: $x.value, emit: $x}
end;
select(.emit).emit ) ]