使用带有外部命令的jq修改json中的键值



给定一个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默认情况下不支持毫秒。因此,为了使用内置的日期时间函数,您必须删除毫秒。其他答案在功能上也是正确的。但我喜欢我的:-(

最新更新