Преобразование объекта метки времени в формате json в метку времени в виде строки

#json #mongodb #awk #jq #datetime-format

#json #mongodb #awk #jq #datetime-формат

Вопрос:

У меня есть json, экспортированный из Mongodb. Он показывает временную метку в другом формате "timestamp":{"$date":"2020-08-01T00:00:00Z"}} . Я хочу преобразовать этот объект timestamp в строку, подобную "timestamp":"2020-08-01T00:00:00Z" .

Я сделал это, используя sed like s/{"[$]date":"(S{20})"}/"1"/g; . Однако длина метки времени может измениться, если к времени добавить миллисекунды .Например: "timestamp":{"$date":"2020-08-01T00:00:00.123Z"}} будет преобразован с s/{"[$]date":"(S{23})"}/"1"/g; помощью , поскольку длина строки метки времени составляет 23 символа. Я хочу преобразовать это в один шаг преобразования, где подойдет любая длина строки.

Я могу сделать это и с помощью jq, но для этого нужно будет читать каждую строку, сохранять значение в переменной и использовать awk для изменения значения. Это займет много времени по сравнению с sed . Итак, ищем другое решение.

Хороший ответ был бы очень признателен. Спасибо

Комментарии:

1. Используется jq для синтаксического анализа / изменения данных JSON.

2. jq не выполняет редактирование на месте

3. jq ... INPUT | sponge INPUT

4. Что не так с простым старым jq ... INPUT > tmp amp;amp; mv tmp INPUT ?

5. @EdMorton — Параллелизм? (Особенно, если вы имеете в виду «tmp» буквально.)

Ответ №1:

Рассмотрим:

 walk( if type == "object" and has("$date")
      then .["$date"] else . end )
  

Это может привести к потере данных, поэтому вы можете рассмотреть аналогичные альтернативы, например, более сильное предварительное условие или предварительное условие с использованием ожидаемого имени ключа. Или вы можете захотеть вызвать ошибку, если объект «дата» не соответствует ожидаемому.

Комментарии:

1. walk — это инструмент Linux, можете ли вы уточнить, как использовать имя файла в команде и т. Д..

2. что еще более важно, как это будет редактировать файл, это то же самое, что использовать jq, как я написал в вопросе

3. Мой ответ дает решение jq. walk В моем ответе — это функция jq.

Ответ №2:

Я понял это. Этот ответ для тех, кто ищет подобное решение .

cat test.json | jq ' .location.timestamp = .location.timestamp."$date"' | sponge test.json

Я не знал, как использовать sponge, sponge — это здорово!

Комментарии:

1. К вашему СВЕДЕНИЮ: есть еще один инструмент unix для манипулирования json jtc — он такой же мощный, как jq. jtc способен изменять файлы на месте (так что вы можете сделать это одной командой без перехода к sponge). Например, ваш запрос jtc (с изменением файла на месте) будет выглядеть так: jtc -x'<timestamp>l:' -y[0] -y[0][-1] -sf test.json . PS. Я разработчик jtc .