#json #select #conditional-statements #jq
Вопрос:
У меня есть документ json, в котором мне нужно извлечь оба значения подполя a тегов 035 и 999, когда 035.подполя[].ind1 и 035.подполя[].ind2 являются «0». Вот мой документ:
{
"leader": "01815cam a22004934a 4500",
"fields": [
{
"001": "mig00005597434"
},
{
"035": {
"subfields": [
{
"a": "(OCoLC)67764532"
}
],
"ind1": " ",
"ind2": " "
}
},
{
"035": {
"subfields": [
{
"a": "ocm00000001projmusemuse13792"
}
],
"ind1": "0",
"ind2": "0"
}
},
{
"245": {
"subfields": [
{
"a": "The Sins of the Father"
},
{
"b": "A Romance of the South /"
},
{
"c": "by Thomas Dixon ; with an introduction by Steven Weisenburger."
}
],
"ind1": "1",
"ind2": "4"
}
},
{
"999": {
"subfields": [
{
"i": "a1b7fa7e-9e2e-4973-96d0-3939235c8b80"
},
{
"s": "020d182f-ba5d-4bbe-a2eb-e4390aa0736c"
}
],
"ind1": "f",
"ind2": "f"
}
}
]
}
Мой желаемый результат таков
ocm00000001projmusemuse13792 020d182f-ba5d-4bbe-a2eb-e4390aa0736c
Когда я пытаюсь получить оба значения,
jq -r '.fields[] | [(select(."035".ind1 == "0" and ."035".ind2 == "0") | ."035".subfields[].a), (select(."999") |."999".subfields[].s)] '
Я получаю
[]
[]
[
"ocm00000001projmusemuse13792"
]
[]
[
null,
"020d182f-ba5d-4bbe-a2eb-e4390aa0736c"
]
Но и другие варианты, в которых я пытаюсь переместить выделение 999 (например
jq '.fields[] | [(select(."035".ind1 == "0" and ."035".ind2 == "0") | ."035".subfields[].a), (select(."999".subfields[].s) | ."999".subfields[].s)] '
Я понимаю, что не могу перебирать нуль. Чего мне не хватает?
Ответ №1:
С помощью параметра командной строки-r фильтр:
[.fields[]
| (select(."035".ind1 == "0" and ."035".ind2 == "0")
| (."035".subfields[] | select(.a) | .a) ),
(select(."999")
| (."999".subfields[] | select(.s) | .s) ) ]
| join(" ")
доходность:
ocm00000001projmusemuse13792 020d182f-ba5d-4bbe-a2eb-e4390aa0736c
Комментарии:
1. Похоже, я не полностью сосредоточился на утверждениях select. Мне нравится ваш синтаксис-очень легко следовать