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)
问题:
我可以获取每个变量的单个值,但不确定如何在单个输出对象中将它们全部串联起来。
您可以将更新链接在一起,如下所示:
.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)
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |