Из описания проблемы (и из-за того, что предложенное решение 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