微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 sed 替换 GCS json 文件中的日期时间值

如何解决使用 sed 替换 GCS json 文件中的日期时间值

我需要用日期替换存储在 GCS 中的 json 文件中的日期时间值: 例如日期时间戳值 "2020-04-18 10:09:09.433000" 应替换为 2020-04-18 去掉时间戳部分。

我尝试了以下方法

gsutil cp gs://bucket/cloudsql_to_bigquery/Accounts_test - \
| sed  -e's/[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]*//g' \
| gsutil cp - gs://bucket/cloudsql_to_bigquery/Accounts_test

但我一直以应用程序/八位字节文件类型而不是 JSON 结束,不知道为什么我的 sed 也没有按预期工作。有什么线索可以解决这个问题吗?

示例 json 文件

{"_etblBudgets_Checksum": null,"_etblBudgets_dCreatedDate": null,"_etblBudgets_dModifiedDate": "2020-03-20 06:37:29.630000","_etblBudgets_iBranchID": null,"_etblBudgets_iChangeSetID": 1,"_etblBudgets_iCreatedAgentID": null,"_etblBudgets_iCreatedBranchID": null,"_etblBudgets_iModifiedAgentID": 0,"_etblBudgets_iModifiedBranchID": 0,"dBudgetDTStamp": null,"fBudget": null,"fBudgetForeign": 0.0,"fForecast": 0.0,"fForecastForeign": 0.0,"fUnprocessedPovalue": -1768.0100000000002,"fUnprocessedPovalueForeign": 0.0,"iBudgetAccountID": 137,"iBudgetAccountType": 36,"iBudgetPeriodID": 12,"iBudgetProjectID": 7,"iBudgetTxBranchID": 0,"idBudgets": 1}
{"_etblBudgets_Checksum": null,"fUnprocessedPovalue": -19238.68,"iBudgetAccountID": 138,"idBudgets": 2}
{"_etblBudgets_Checksum": null,"fUnprocessedPovalue": -38647.87,"iBudgetProjectID": 8,"idBudgets": 3}
{"_etblBudgets_Checksum": null,"fUnprocessedPovalue": 0.0,"iBudgetProjectID": 9,"idBudgets": 4}

预期输出

{"_etblBudgets_Checksum": null,"_etblBudgets_dModifiedDate": "2020-03-20","idBudgets": 4}

解决方法

一些建议:

  1. 我建议使匹配正则表达式尽可能具体,以避免在文件获得了您不期望的数据时无意中匹配了您不想要的内容。这是一个更具体的 sed 表达式:

    sed -E 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) .*/\1/'

  2. 在尝试使用它下载/上传之前,您可以测试您的 sed 表达式是否在本地工作,例如,从 shell 运行此管道:

    回声 2020-04-18 10:09:09.433000 | sed -E 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) .*/\1/'

  3. 我建议不要进行流式上传/下载(gsutil cp 以“-”作为源或 dest 参数),因为这不会使用数据校验和验证(这可能会导致数据损坏)。所以,使用类似的东西:

    gsutil cp gs://bucket/cloudsql_to_bigquery/Accounts_test /tmp/Accounts_test

    sed -E 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) .*/\1/' /tmp/Accounts_test > / tmp/Accounts_test_truncated_timestamps

    gsutil cp /tmp/Accounts_test_truncated_timestamps gs://bucket/cloudsql_to_bigquery/Accounts_test

    rm /tmp/Accounts_test_truncated_timestamps

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。