JSON和jq更新多个值

Art*_*ski 2 bash json updates jq

嗨,我试图在单个“ jq”命令中执行计算,但是我无法锻炼如何引用新值。

原始JSON

{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": "2017-03-17 15:06:40",
  "End": "2017-03-17 15:08:37",
  "Period": "1 Minutes "
}
Run Code Online (Sandbox Code Playgroud)

我的目标是将开始时间和结束时间转换为纪元,并以秒为单位锻炼持续时间。然后输出具有新值的相同对象。

当我这样做时

echo $J_SON | jq '.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime),.End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)'
Run Code Online (Sandbox Code Playgroud)

输出为:

{
  "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 "
}
Run Code Online (Sandbox Code Playgroud)

这很有道理,手册说这是默认行为。

jq中的赋值工作与大多数编程语言中的稍有不同。jq不会区分对某物的引用和副本-两个对象或数组相等或不相等,没有任何其他概念是“同一对象”或“不同对象”。

如果一个对象有两个字段,即数组.foo和.bar,并且将某些内容附加到.foo,则即使先前已设置.bar = .foo,.bar也不会变大。如果您习惯使用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))'
Run Code Online (Sandbox Code Playgroud)

输出量

{
  "Status": "Down",
  "StatusID": "75328241",
  "Start": "2017-03-17 15:06:40",
  "End": "2017-03-17 15:08:37",
  "Period": 117
}
Run Code Online (Sandbox Code Playgroud)

问题:

我可以获取每个变量的单个值,但不确定如何在单个输出对象中将它们全部串联起来。

pea*_*eak 5

您可以将更新链接在一起,如下所示:

.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .Period = (.End - .Start)
Run Code Online (Sandbox Code Playgroud)