Условное извлечение jq двух элементов в разных местах иерархии

#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. Мне нравится ваш синтаксис-очень легко следовать