给定一个json
文件,如何使用jq
和外部命令来修改值?
在我的情况下,我想将完整的时间戳转换为YYYY-MM-DD
格式(例如,使用命令:date --date="2019-01-02T10:00:00.000Z" "+%Y-%m-%d"
(
原始JSON
[{"timestamp": "2019-01-01T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}]
新的JSON
[{"timestamp": "2019-01-01"}, {"timestamp": "2019-01-02"}, {"timestamp": "2019-01-02"}]
给定您的样本输入,这应该可以做到:
map(.timestamp |= .[:10])
如果这看起来过于简单化,那么看看jq的日期操作内置程序;您可能不需要外部工具。
如何使用jq和外部命令修改值
这是可以做到的,尽管它并不漂亮:
jq --argjson update "$(jq -r '.[] | .timestamp' input.json |
while read r ; do
date --date="$r" "+%Y-%m-%d"
done |
jq -nR [inputs] )" '
reduce range(0;$update|length) as $i (.;
.[$i].timestamp = $update[$i])
' input.json
(在某些环境中,可能需要调用gdate
而不是date
。(
对于时间.json=
[{"timestamp": "2019-01-01T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}]
使用
jq '[.[] | .timestamp |= (sub("\.[0-9]+Z$"; "Z") | fromdate | strftime("%Y-%m-%d"))]' time.json
产生
[
{
"timestamp": "2019-01-01"
},
{
"timestamp": "2019-01-02"
},
{
"timestamp": "2019-01-02"
}
]
编辑注意:sub是因为jq默认情况下不支持毫秒。因此,为了使用内置的日期时间函数,您必须删除毫秒。其他答案在功能上也是正确的。但我喜欢我的:-(