JSON JQ, если без других
Я использую следующую команду JQ для фильтрации JSON. Мое требование - отфильтровать сообщение JSON, если присутствует ожидаемый node. Или, ничего не делайте. Следовательно, я использую if, elif,....
sed -n "s/.*Service - //p" $1/response.log* |
jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
elif (.result | length ) != 0 then .result |= map(select(.id== \"123\"))
else " " end" > ~/result.log
Похоже, что здесь обязательно. Я не хочу ничего делать внутри блока else. В любом случае, я могу игнорировать другие или просто печатать некоторые whitespce внутри else.
В приведенном выше случае он печатает двойные кавычки "" в файле результатов.
Ответы
Ответ 1
Вы можете использовать идиому:
if CONDITION then WHATEVER else empty end
empty
- это фильтр, который вообще ничего не выводит - даже ноль, что, в конце концов, является чем-то (а именно значением JSON). Это немного похоже на черную дыру, только чернее - она будет поглощать все, что предложила, но в отличие от черной дыры она даже не излучает излучение Хокинга.
В вашем случае у вас есть "elif", так что использование "else empty", вероятно, то, что вам нужно, но для справки, приведенное выше в точности эквивалентно:
select(CONDITION) | WHATEVER
PS Я предполагаю, что, какой бы ни была цель команды sed, это можно сделать более надежно как часть программы jq, возможно, с использованием walk/1
.
ОБНОВИТЬ
После выпуска jq 1.6 было внесено изменение, так что "если без другого" имеет семантику "если _, то _ еще. Конец", то есть:
if P then Q end
=== if P then Q else. end
if P then Q else. end
Ответ 2
Поскольку вы не вносите никаких дальнейших изменений в объект, просто используйте фильтр "identity" .
.
if (.requests | length) then ... else . end
С другой стороны, вы просто обновляете свойство requests
или result
, если не пусто, используя map
. Проверка не требуется. Если он пуст, то он будет пустым.
Вы можете упростить свой фильтр:
.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))