É possível converter este json:
[
{
"bytes": 276697,
"checked": false
},
{
"bytes": 276697,
"checked": false
}
]
para uma tabela COM cabeçalhos em jq?
Eu tentei:
cat file.json | jq '.[] | join(",")'
mas omite cabeçalhos:
"276697,false"
"276697,false"
deveria ser:
"bytes,checked"
"276697,false"
"276697,false"
Eu esperava que você pudesse executar apenas dois comandos:
cat file.json | jq '.[] | keys, .[] | join(",")'
mas o segundo falha:
"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)
Idealmente, seria mais simples que isso .
Você pode escolher os cabeçalhos como uma matriz de strings das chaves do primeiro elemento da lista e, em seguida, extrair os valores de todos os elementos como matrizes separadas. Aplicar o
@csv
operador de saída a cada elemento da lista resultante colocará aspas em CSV nos dados (jq
cita todas as strings, mas não booleanos ou números):Ou,
Ou,
Ou qualquer outra forma de extrair os valores em matrizes separadas.
Observe que isso depende que as chaves ocorram na mesma ordem em todos os dados de entrada.
Porém, é ainda mais fácil com Miller (
mlr
):Isso simplesmente passa os dados pelo comando de Miller
cat
(que, quando usado assim, não modifica os dados), enquanto converte de JSON para CSV usando a--j2c
opção (abreviação de--ijson --ocsv
). Observe que, como o Miller reconhece adequadamente o CSV, ele apenas cita os campos que realmente precisam ser citados.Você também pode obter uma tabela bem formatada escolhendo o formato de saída bem impresso junto com
--barred
:(
--j2p
é a abreviação de--ijson --opprint
.)Ou sem
--barred
:Eu entendi:
parece que você pode colocar qualquer parte entre parênteses para evitar que ela "consuma" o stream (não sei se é assim que se chama ou mesmo se entendi aqui, porque não consegui encontrar nada na documentação do jq e tive para juntar tudo com pedaços espalhados por vários blogs e stackoverflows, então, se houver uma maneira "correta" de fazer isso, por favor me avise).
A propósito, se você tiver um shell for loop como eu, use a opção -s para combinar objetos json separados: