我有一个巨大的NDJSON文件,其中有一个字段是"createDate":"01/02/2018"
。它是dd/mm/yyyy
格式,我需要将其转换为yyyy-mm-dd
格式。
我可以使用以下命令在一个小输入上使用sed
来执行此操作:
echo 28/02/2018 | sed 's,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,'
但是,我找不到必须在 JSON 文件中执行此操作的解决方案,其中此值位于名为"createDate"
的键下。
示例 JSON 对象如下所示:
{
"pushNotificationEnabled": "true",
"createDate": "11/08/2018",
"email": null,
"photoUrl": null
}
任何帮助将不胜感激。
您的命令适用于您的示例 JSON 对象!您可能希望将其操作限制为createDate
字段:
sed '/"createDate":/s,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,' input.json
这只会影响包含"createDate":
标记的行:
==> input.json <==
{
"pushNotificationEnabled": "true",
"createDate": "11/08/2018",
"modifyDate": "31/08/2018",
"email": null,
"photoUrl": null
}
$ sed '/"createDate":/s,([0-9][0-9])/([0-1][0-9])/([1-2][0-9][0-9][0-9]),3-2-1,' input.json
{
"pushNotificationEnabled": "true",
"createDate": "2018-08-11",
"modifyDate": "31/08/2018",
"email": null,
"photoUrl": null
}
假设 NDJSON 文件中的每个对象都能舒适地放入内存中,无论文件本身有多大,按照以下行调用 jq 都应该可以完成这项工作,因为 jq 一次只会读取一个 JSON 实体:
jq '.createDate |=
sub("^(?<m>[0-9]*)/(?<d>[0-9]*)/(?<y>[0-9]*)"; "(.y)-(.m)-(.d)")' input.json
尽管 jq 对于该任务的效率可能略低于 sed,但它确实可以理解 JSON。