Quero gerar uma chave específica de uma lista de hashes como linhas onde cada item externo do array é separado por uma linha vazia. Para ilustrar:
A entrada é:
[
[
{
"visible": true,
"url": "url-1"
},
{
"visible": true
},
{
"visible": false,
"url": "url-2"
}
],
[
{
"visible": true,
"url": "url-a"
},
{
"visible": true,
"url": null
},
{
"visible": false,
"url": "url-b"
}
]
]
A saída esperada é:
url-1
url-2
url-a
url-b
Agora, posso obter a saída que desejo usando o seguinte:
cat input.txt | jq 'walk(if type == "object" then (.url | select( . != null)) end) | .[] | select(length > 0)' | jq 'join("\n")' | jq -rs 'join("\n\n")'
Há dois problemas aqui:
- Escolher o valor de uma chave específica, sem destruir a hierarquia e manipular valores nulos potenciais (porque a chave não existia, ou na verdade era
null
) é tudo manipulado pela primeirajq
invocação, então obtemos uma lista de uma lista de strings - A segunda e a terceira invocação transformam isso na saída desejada, uma lista de strings (brutas), onde cada URL obtém sua própria linha, e as diferentes entradas da matriz externa são separadas por uma linha vazia.
Mas parece que deve haver uma solução mais fácil para qualquer um desses problemas, especialmente para o segundo.
Isso une as
url
strings de todos os elementos de uma submatriz com quebras de linha e, em seguida, une todas as strings geradas das submatriz com quebras de linha duplas.Isso trataria strings
null
com valor -url
como strings vazias e produziria linhas vazias. Para evitar isso, você pode usar.url // empty
in no lugar de just.url
najq
expressão. Isso eliminaria quaisquerurl
valores ausentes e quaisquer valores que sejamnull
oufalse
.