Изменить значение ключа в json, используя jq с внешней командой - PullRequest
1 голос
/ 10 ноября 2019

Учитывая файл 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"}]

Ответы [ 3 ]

3 голосов
/ 10 ноября 2019

Учитывая ваш пример ввода, он должен это сделать:

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

Если это выглядит слишком упрощенно, взгляните на встроенные в jq манипуляции с датами ;вам вероятно здесь не нужен внешний инструмент.

2 голосов
/ 10 ноября 2019

как я могу использовать 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.)

1 голос
/ 10 ноября 2019

Для 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"
  }
]

Редактировать Примечание: подпрограмма, потому что jq делает не поддержка миллисекунд по умолчанию. Таким образом, чтобы использовать встроенные функции datetime, вам нужно отбросить миллисекунды. Другие ответы также функционально верны. Но мне нравится мой: -)

...