#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: Большое спасибо, теперь я понял.