A funcionalidade padrão jq
é enviar cada objeto de uma matriz, um de cada vez, embora o join
operador possa mesclar esses valores. Meu problema é tentar imprimir todos os valores de vários arrays de uma só vez. Tomando este exemplo:
{
"key1": {
"list1": [
"val1",
"val2",
"val3"
]
},
"key2": {
"list1": [
"val4",
"val5"
]
},
"key3": {
"list1": [
"val6"
]
}
}
Eu gostaria de imprimir:
val1 val2 val3 val4 val5 val6
E até agora temos isto:
jq -r 'to_entries[] | { list: .value.list1 } | .list | join(" ")' test.json
(Mais detalhado do que o necessário para ajudar os revisores.)
que dá:
val1 val2 val3
val4 val5
val6
Existe uma maneira de reunir todos os valores em um comando?
Crie um novo array com todos os elementos de cada
list1
array de cada chave de nível superior. Em seguida, junte seus elementos com espaços. Isso forneceria os valores na ordem em que ocorrem no arquivo de entrada.Uma abordagem alternativa (e possivelmente mais simples) é
map(.list1)
which retorna uma matriz de matrizes que você pode nivelar e unir:Sua tentativa gera uma string unida por chave de nível superior por
.list
ser uma daslist1
matrizes. Sua abordagem funcionaria se você encapsulasse tudo até o último símbolo de barra vertical em a[ ... ]
(e expandisse.list
with.list[]
) para gerar uma única matriz à qual você então se juntaria. Isto é o que faço na minha primeira abordagem acima; só que uso uma expressão um pouco mais curta para gerar os elementos desse array.