Предполагая, что ваш Area.json является действительным JSON, тогда я считаю, что следующие действия приблизятся к выполнению вашего предполагаемого редактирования:
names='["name1","name2","name3","name4"]'
jq --argjson names "$names" '.features[].properties.name = $names
' < areas.json
Однако, учитывая ваше предложенное решение, мне не ясно, что вы подразумеваете под "случайным значением из 1d-массива". Если вы имеете в виду, что индекс должен выбираться случайным образом (например, с помощью PRNG), то я бы предложил вычислить его, используя ваш любимый PRNG, и передать это случайное значение в качестве еще одного аргумента для jq, как показано в следующем разделе.
Таким образом, возникает вопрос, как преобразовать текст
['name1','name2','name3','name4']
в допустимый массив JSON. Существует множество способов сделать это, используя jq или нет, но я считаю, что лучше оставить его как отдельный вопрос или как упражнение, потому что выбор метода, вероятно, будет зависеть от конкретных деталей, которые не упомянуты в этом вопросе. Лично я бы использовал sed
, если это возможно; Вы можете также рассмотреть возможность использования hjson , как также показано в следующем разделе.
Иллюстрация с использованием hjson и awk
hjson -j <<< "['name1','name2','name3','name4']" > names.json.tmp
function randint {
awk -v n="$(jq length names.json.tmp)" '
function randint(n) {return int(n * rand())}
BEGIN {srand(); print randint(n)}'
}
jq --argfile names names.json.tmp --argjson n $(randint) '
.features[].properties.name = $names[$n]
' < areas.json
Добавление
В настоящее время jq не имеет встроенного PRNG, но если вы хотите использовать jq и хотите, чтобы значение из массива «names» выбиралось случайным образом (с заменой?) Для каждого вхождения поля .name затем можно было бы предварительно рассчитать массив случайно выбранных имен (массив длиной features | length
), используя ваш любимый PRNG, и передать этот массив в jq:
jq --argjson randomnames "$randomnames" '
reduce range(0; .features[]|length) as $i (.;
.features[$i].properties.name = $randomnames[$i])
' < areas.json
Другой вариант - использовать PRNG, написанный на jq, как показано в других местах на этой странице.