Analisa o valor de um elemento específico em uma posição aleatória de um arquivo JSON

1

Gostaria de corresponder o valor depois de "sid" para VALUE1 (= 789069 )
O problema é que a ordem das linhas é aleatória.

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER","data":[{"VALUE2":809}],"sid":"788325","units":"kWm","age":11},
{"cid":"PWER_SUB","data":[{"VALUE3":278}],"sid":"789540","units":null,"age":1},
{"cid":"PWER_SUB","data":[{"VALUE4":319}],"sid":"789093","units":null,"age":38},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}

Alguma idéia de como combiná-lo?

    
por amprantino 24.01.2017 / 15:54

3 respostas

4

Supondo que o ] ausente esteja inserido no final, este é um documento JSON e deve ser analisado com um analisador JSON, como jq .

Usando jq :

$ jq -r '.[] | select(.data[0].VALUE1) | .sid' data.json
789069

Isso levará a matriz de objetos JSON e selecionará o objeto que possui uma chave chamada VALUE1 no primeiro elemento da entrada da matriz data . Em seguida, ele extrairá o valor da entrada sid desse objeto.

A opção -r para jq é para "saída bruta". Sem isso, teríamos recebido um valor com aspas duplas.

    
por 24.01.2017 / 18:54
1

O grep é uma boa ferramenta para este tipo de problemas %código% . É isso que você está procurando?

UPDATE : não é TI !!! (Desculpe: eu não entendi a pergunta inicial.)

segunda versão: usando uma ferramenta json chamada grep -oP '"sid":"\d+"' file :

cat a.json | json -c '"VALUE1" in this.data[0]' | json -a sid

ou

cat a.json | json -c '"VALUE1" in this.data[0]' -a sid 
  • json - filtra os elementos (filtro)
  • json -c predicate - aplica expressão a todos os elementos (mapa)

documentação em: link . Se não estiver instalado:

install node
and sudo npm install -g json
    
por 24.01.2017 / 16:20
0

Em awk , se você quiser comparar o registro inteiro, poderá usar:

awk '{if($0~/789069/){print $0}}' file

Nesse código, awk verificará se uma linha inclui o valor 789069 , em seguida, imprimirá como está e ignora outras linhas.

Saída:

[{"cid":"PWER","data":[{"VALUE1":0}],"sid":"789069","units":"kWm","age":586667},
{"cid":"PWER_SUB","data":[{"VALUE5":0}],"sid":"789069","units":null,"age":4}
    
por 24.01.2017 / 16:27