JQ, если значение совпадает, то конец обновления - PullRequest
0 голосов
/ 10 сентября 2018

Для этих данных https://jqplay.org/s/onlU9ghjn1

Я не могу понять правильный синтаксис, чтобы сделать что-то вроде

.gcp_price_list | ."CP-COMPUTEENGINE-OS" | 
(
    if ( .[].cores == "shared" ) then
        .[].cores = 0.5 
    end
)

Кажется, мне нужна часть else, но я не уверен, что туда поставить. Если я сделаю:

.gcp_price_list | ."CP-COMPUTEENGINE-OS" | 
(
    if ( .[].cores == "shared" ) then
        .[].cores = 0.5 
    else .[].cores = .[].cores end
)

В результате все еще есть "общий доступ", т. Е.

  "win": {
    "low": 0.02,
    "high": 0.04,
    "cores": "shared",
    "percore": true
  }

Входные данные копируются в результат, а это не то, что я хочу.

Связанные, но я не нахожу их очень полезными, вопросы

JQ Если тогда остальное

Как обновить одно значение в документе json с помощью jq?


Моя практическая альтернатива - «заменить все» текстовым редактором, но я оставлю этот вопрос здесь на случай элегантного решения.

1 Ответ

0 голосов
/ 10 сентября 2018

Похоже, что вы хотите:

.gcp_price_list
| ."CP-COMPUTEENGINE-OS"
| map_values(
    if .cores == "shared" 
    then .cores = 0.5 
    else . end )

В любом случае будьте осторожны при использовании выражений, таких как .[].cores, в качестве аргументов if, then или else, поскольку они создают поток результатов.

В будущем, пожалуйста, следуйте инструкциям MCVE .

Постскриптум

Если вы хотите редактировать документ JSON, вы должны использовать |= примерно так:

.gcp_price_list."CP-COMPUTEENGINE-OS" |= 
  map_values(
    if ( .cores == "shared" ) then
        .cores = 0.5 
    else . end
  )
...