JSON和jq更新多个值
问题描述:
嗨我正在尝试在单个“jq”命令中执行一个计算,但我无法制定如何引用新值。JSON和jq更新多个值
原始JSON
{
"Status": "Down",
"StatusID": "75328241",
"Start": "2017-03-17 15:06:40",
"End": "2017-03-17 15:08:37",
"Period": "1 Minutes "
}
我的目标是在开始和结束时间转换为时代和锻炼的时间以秒计。然后用新值输出相同的对象。
当我这样做
echo $J_SON | jq '.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime),.End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)'
输出是:
{
"Status": "Down",
"StatusID": "75328241",
"Start": 1489763200,
"End": "2017-03-17 15:08:37",
"Period": "1 Minutes "
}
{
"Status": "Down",
"StatusID": "75328241",
"Start": "2017-03-17 15:06:40",
"End": 1489763317,
"Period": "1 Minutes "
}
这是有道理的,手册上说,这是默认行为。
jq中的分配工作与大多数编程 语言有些不同。 jq不区分 的引用和副本 - 两个对象或数组相等或不相等, 没有任何进一步的概念,即“同一对象”或“不相同的 对象”。
如果一个对象有两个字段其阵列,包含.foo和的.bar,你 附加的东西包含.foo,那么的.bar不会得到更大的,即使 您之前设置的.bar =包含.foo 。如果您习惯于使用Python,Java,Ruby,Javascript等语言编程 ,那么您可以认为它是 ,就像jq在执行任务之前完成每个对象的完整深层副本实际上这样做,但这是一般的想法)。
但是,我会然后想输出在时代以及秒的值。
我设法成功地得到这样的持续时间:
echo $J_SON | jq '.Period = ((.End | strptime("%Y-%m-%d %H:%M:%S") | mktime)-(.Start | strptime("%Y-%m-%d %H:%M:%S") | mktime))'
输出
{
"Status": "Down",
"StatusID": "75328241",
"Start": "2017-03-17 15:06:40",
"End": "2017-03-17 15:08:37",
"Period": 117
}
问题:
我可以得到每个变量的各个值,但不确定如何在单个输出对象中连接它们。
答
你可以链在一起的更新,像这样:
.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .Period = (.End - .Start)
谢谢,非常完美。我不明白的是“过滤器分离器”。如果它只对特定值的子对象起作用,那你为什么要在管道上使用它。我想在阅读数值和动态更改时使用它是有道理的,在这种情况下,您不需要管道。 – Arturski