您好我正在尝试在单个“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在它之前完成每个对象的完整深层副本一样 分配(为了表现它实际上并没有这样做,但是 这是一般的想法。)
但我想在epoch和seconds中输出值。
我成功地获得了这样的持续时间:
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
}
问题:
我可以获取每个变量的各个值,但不知道如何在单个输出对象中将它们连接起来。
答案 0 :(得分:4)
您可以将更新链接在一起,如下所示:
.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)
| .Period = (.End - .Start)