Recentemente descobri jq
e gron
. Para meu caso de uso, gron
é suficiente, mas estou um pouco preocupado com a falta de desenvolvimento. Há alguns bugs que não foram corrigidos em um ano, enquanto vejo que jq
está sendo desenvolvido ativamente.
Então eu gostaria de emular gron
usando jq
. Suspeito que não seja muito difícil, mas meu conhecimento jq
é limitado.
Como exemplo, gostaria de usar jq
para obter esta saída:
T424f7496c3a01 -14889.86
demo -15030.785
a partir desta entrada:
{
"T424f7496c3a01": {
"remaining": -14889.86,
"ts": 136572.504
},
"demo": {
"remaining": -15030.785,
"ts": 0.515
}
}
Eu criei este jq
script que faz isso:
jq -r '[keys,([.[]|.remaining|round|"\t"+tostring])]|transpose|.[]|add'
mas é muito menos legível do que
gron | fgrep '.remaining = '
que produz
json.T424f7496c3a01.remaining = -18079.105;
json.demo.remaining = -18220.029;
que pode ser facilmente analisado usando um IFS=" .=;" read
loop em bash
.
Então, estou fazendo uma pergunta sobre manutenibilidade de longo prazo: existe um script simples jq
que possa me dar algo facilmente analisável em bash
? Temo que usando o jq
script acima em um mês eu não terei ideia de como ele funciona...
PS
A resposta que escolhi responde à consulta acima. Eu esperava que houvesse uma resposta igualmente simples para a consulta mencionada no título, ou seja, emulando gron
usando jq
. Na verdade, o comentário abaixo de @Kusalananda faz referência a How to print path and key values of JSON file , onde a resposta escolhida é próxima o suficiente de uma gron
emulação. Infelizmente, essa solução é muito complexa para satisfazer meus objetivos de manutenção e legibilidade de longo prazo.
Converta o objeto de entrada para um conjunto de "entradas" com
to_entries
. Cada entrada é um objeto com umakey
chave (a chave do objeto) e umavalue
chave (o valor dessa chave no objeto).Selecione
.key
e o valor correspondente.value.remaining
de cada entrada e coloque-os em uma matriz que você passa@tsv
para gerar uma lista delimitada por tabulações.Você pode ler isso
IFS=$'\t' read -r the_id remaining
em um loop, se quiser, supondo que nenhuma tecla contenha tabulações literais ou novas linhas.Com resultados intermediários exibidos: