jq -установить значение на другое значение условно

Проще всего было бы создать неправильное имя файла и правильное имя файла в той же среде, где произошел сбой, а затем просто переместить/переименовать папки с правильными именами.

Во избежание конфликтов между существующими именами лучше использовать другую папку назначения.

./saveLocationA/wrongname1 ->./saveLocationB/correctname1
./saveLocationA/wrongname2 ->./saveLocationB/correctname2
./saveLocationA/wrongname3 ->./saveLocationB/correctname3

Если возможно, я бы предпочел исправить скрипт и просто запустить его снова; исправление некоторых странных ошибок после вскрытия, вероятно, стоит дороже и может привести к новым проблемам.

Удачи!

3
11.10.2021, 16:01
1 ответ

Пустая строка по-прежнему является строкой, поэтому .abc_severity?даст вам пустую строку, а неnull(илиfalse). Также обратите внимание, что вопросительный знак примерно означает «заменить на null, если этот ключ не существует». В примере все три ключа существуют, и их значения не равны null.

Если бы вы использовали nullдля пустых значений, ваше выражение jqвыглядело бы как

.Severity = (.abc_severity //.def_severity //.ghi_severity )

Приведенное выше выражение выбрало бы первое из трех значений, которые не были null, проверяя левое -самое первое и идущее вправо, или null, если бы все они были null. Но сейчас это не сработает, поскольку нам приходится иметь дело с пустыми строками так, как если бы они были null.

Мы можем сделать это, введя вспомогательную функцию (, чтобы немного сократить объем набора текста):

def n: if. == "" then null else. end;
.Severity = ((.abc_severity|n) // (.def_severity|n) // (.ghi_severity|n) // "")

Наша вспомогательная функция nвозвращает строку как -, если она не пуста; в противном случае возвращается null. С помощью связанных операторов //мы выбираем первое значение из трех, которое не является null, если смотреть через n, или пустую строку, если все три значения равны null.

Тестирование вышеуказанного в командной строке с вашими данными:

$ jq 'def n: if. == "" then null else. end;.Severity = ((.abc_severity|n) // (.def_severity|n) // (.ghi_severity|n) // "")' file
{
  "name": "0230",
  "publish_date": "2007-08-18",
  "abc_severity": "",
  "def_severity": "medium",
  "ghi_severity": "negligible",
  "Severity": "medium"
}
2
11.10.2021, 16:51

Теги

Похожие вопросы