#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
.