【问题标题】:Modify a key-value in a json using jq with external command使用带有外部命令的 jq 修改 json 中的键值
【发布时间】:2019-11-10 06:20:10
【问题描述】:

给定一个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"}]

【问题讨论】:

    标签: json bash shell jq


    【解决方案1】:

    鉴于您的示例输入,应该这样做:

    map(.timestamp |= .[:10])
    

    如果这看起来过于简单,请查看jq's date manipulation builtins;您可能在这里不需要外部工具。

    【讨论】:

      【解决方案2】:

      如何使用 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。)

      【讨论】:

        【解决方案3】:

        对于 time.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默认支持毫秒。因此,为了使用内置的日期时间函数,您必须删除毫秒。其他答案在功能上也是正确的。但我喜欢我的:-)

        【讨论】:

          猜你喜欢
          • 2017-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多