найти и заменить вложенные ключи JSON - PullRequest
0 голосов
/ 08 октября 2018

У меня есть огромный JSON-файл, который содержит такие записи:

{"callsign":"abc","kruxSegmentIds":{"0":"q2d9nn1qv","1":"rle4kfgsf"},"liveFlag":"Y"}}

Мне нужно заменить ключи внутри вложенного JSON-ключа "kruxSegmentIds" таким образом, чтобы 0 становилось "нулем", а 1как "один", как показано ниже:

{"callsign":"abc","kruxSegmentIds":{"zero":"q2d9nn1qv","one":"rle4kfgsf"},"liveFlag":"Y"}}

Возможно ли это с помощью sed?Я не хочу писать сценарий, так как размер файла огромен, и он может не помещаться в память.

Любая помощь / поддержка очень ценится.

1 Ответ

0 голосов
/ 08 октября 2018

Из описания проблемы (и из-за того, что предложенное решение awk было принято) становится ясно, что, хотя сам файл большой, каждый документ JSON относительно мал или, по крайней мере, достаточно мал, чтобы поместиться в памяти.Если это действительно так, то простое решение с использованием jq будет иметь характеристики производительности, аналогичные решениям sed или awk, но без потенциальных осложнений.Поэтому вот такое решение:

jq '.kruxSegmentIds |= with_entries(.key |= if .=="0" then "zero" elif .=="1" then "one" else . end)'

Если jq empty hugefile не удается из-за размера файла, тогда jq может все еще быть полезным из-за его потокового анализатора, который разработан именно для таких случаев.

Вариации

В комментариях ОП опубликовал еще один пример, поэтому может быть полезно определить фильтр для выполнения преобразования ключ-ключ:

def twiddle:
  with_entries(.key |= if .=="0" then "zero" elif .=="1" then "one" else . end);

С этим, решение исходной задачи:

 .kruxSegmentIds |= twiddle

, а решение варианта:

(.users.L3AVIcqaDpZxLf6ispK.kruxSegmentIds) |= twiddle 

Обобщение еще дальше, если задача состоит в том, чтобы выполнить преобразование для всех объектовгде бы они ни возникали, решение может быть таким:

walk(if type == "object" then twiddle else . end)

Если ваш jq не имеет предопределенного значения walk, то вы можете уменьшить его def из https://raw.githubusercontent.com/stedolan/jq/master/src/builtin.jq

...