Bash JQ проблема с получением нескольких значений в файле JSON

#json #bash #jq

#json #bash #jq

Вопрос:

Я пытаюсь проанализировать файл JSON для получения нескольких значений. Я знаю, как анализировать конкретные значения («A» / «B» /»C») в массиве (.info.file.hashes[]) .

Например: при выполнении следующей команды над файлом b.json

 jq -r '.info.file.hashes[] | select(.name == ("A","B","C")).value' b.json
  

Результат :

 f34d5f2d4577ed6d9ceec516c1f5a744
66031dad95dfe6ad10b35f06c4342faa
9df25fa4e379837e42aaf6d05d92012018d4b659  
  

Где b.json:

 {
  "Finish": 1475668827,
  "Start": 1475668826,
  "info": {
    "file": {
      "Score": 4,
      "file_subtype": "None",
      "file_type": "Image",
      "hashes": [
        {
          "name": "A",
          "value": "f34d5f2d4577ed6d9ceec516c1f5a744"
        },
        {
          "name": "B",
          "value": "66031dad95dfe6ad10b35f06c4342faa"
        },
        {
          "name": "C",
          "value": "9df25fa4e379837e42aaf6d05d92012018d4b659"
        },
        {
          "name": "D",
          "value": "4a51cc531082d216a3cf292f4c39869b462bf6aa"
        },
        {
          "name": "E",
          "value": "e445f412f92b25f3343d5f7adc3c94bdc950601521d5b91e7ce77c21a18259c9"
        }
      ],
      "size": 500
    }
  }
}
  

Теперь, как я могу получить несколько значений с помощью «Finish», «Start» вместе с хэш-значениями? Я попытался выполнить команду.

  jq -r '.info.file.hashes[] | select(.name == ("A","B","C")).value','.Finish','.Start' b.json 
  

и я получаю результат в виде:

 f34d5f2d4577ed6d9ceec516c1f5a744
null
66031dad95dfe6ad10b35f06c4342faa
null
9df25fa4e379837e42aaf6d05d92012018d4b659
null
null
null
  

Ожидаемый результат :

 f34d5f2d4577ed6d9ceec516c1f5a744
66031dad95dfe6ad10b35f06c4342faa
9df25fa4e379837e42aaf6d05d92012018d4b659
1475668827
1475668826
  

Комментарии:

1. Я не знаю jq, но похоже, что вы пытаетесь выбрать start и finish из .info.file.hashes[] массива.

2. Вы также могли бы сделать… jq -r '.info.file.hashes[] | select(.name).value' b.json

3. @l’L’l: Да, верно, но мне нужны только выборочные «значения» из любого из «имен» из хэша. Для опубликованного выше вопроса я пытаюсь получить значения «Finish» и «Start» (1475668827, 1475668826) вместе с выборочными значениями хэша.

4. ^ Вы должны добавить эту информацию в свой вопрос…

Ответ №1:

Буквально только что скачал и прочитал руководство

Попробуйте

 jq '(.info.file.hashes[] |select(.name == ("A","B","C")).value), .Finish, .Start' b.json

"f34d5f2d4577ed6d9ceec516c1f5a744"
"66031dad95dfe6ad10b35f06c4342faa"
"9df25fa4e379837e42aaf6d05d92012018d4b659"
1475668827
1475668826
  

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

Комментарии:

1. 123: Большое спасибо, теперь я понял.