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) 
+0

谢谢,非常完美。我不明白的是“过滤器分离器”。如果它只对特定值的子对象起作用,那你为什么要在管道上使用它。我想在阅读数值和动态更改时使用它是有道理的,在这种情况下,您不需要管道。 – Arturski