Tenho a seguinte estrutura JSON que representa um esquema de banco de dados:
{
"db": [
{
"tables": [
{
"name": "tblFoo",
"cols": [
{
"name": "created",
"types": [ { "data_type": "timestamp" } ]
},
{
"name": "updated",
"types": [ { "data_type": "timestamp" } ]
},
{
"name": "username",
"types": [ { "data_type": "timestamp" } ]
}
]
},
{
"name": "tblBar",
"cols": [
{
"name": "created",
"types": [ { "data_type": "timestamp" } ]
},
…
etc., você entendeu a ideia. Preciso que ele seja transformado em um conjunto sequencial de "comandos" json onde cada tabela e suas colunas são uma linha separada, assim:
[
{"type": "TABLE", name:"tblFoo"},
{"type": "COLUMN", name:"created", ofTable: "tblFoo"},
{"type": "COLUMN", name:"updated", ofTable: "tblFoo"},
…
{"type": "TABLE", name:"tblBar"},
{"type": "COLUMN", name:"created", ofTable: "tblBar"},
]
Eu simplesmente não consigo entender. Eu tentei .db.tables[] | map(…)
no começo, mas isso obviamente só cria uma matriz do primeiro nível, tabelas, e eu não consigo adicionar/injetar as definições de coluna no mesmo nível.
Então tentei iterar sobre as colunas como .db.tables[].cols[]
com o operador decente recursivo, mas novamente a lista resultante é apenas a das colunas e não consigo adicionar/injetar as da tabela na lista de saída.
Você pode me ajudar a entrar no caminho certo?
.db
é um array, então você precisa.db[]
iterar sobre seus itens..db[].tables[]
é suficiente para atingir o nível da tabela. Para as colunas, desça mais para dentro de.cols[]
. Não precisa ir mais fundo (ou usar uma descida recursiva), pois você só precisa dos respectivos.name
valores.Demonstração
Note que o jq é voltado para o processamento lógico de dados JSON, portanto, suas capacidades de formatação são limitadas. Você tem basicamente duas opções: uma saída bem impressa (veja acima) ou uma compactada com todos os caracteres de espaço em branco insignificantes (incluindo novas linhas) removidos. Você pode chegar mais perto da formatação desejada aplicando a última usando o sinalizador
--compact-output
(ou-c
) enquanto omite os colchetes externos do array para obter um fluxo de objetos JSON, cada um impresso em sua própria linha. Note os colchetes externos ausentes e as vírgulas ausentes após cada (exceto a última) linha.Demonstração
Para reproduzir exatamente a formatação desejada, você precisaria compô-la manualmente como uma string. Mas isso vem com uma enorme troca de complexidade convidativa a erros e, portanto, falando de modo geral, não é recomendado. Essa seria uma maneira, usando o sinalizador
--raw-output
(ou-r
) para remover a codificação JSON das linhas de string compostas:Demonstração