Como analisar com script Bash? (plataforma MIPS)? [duplicado]

1
$ curl -LNs "http://urladrescom/content.json" > content.json

content.json

{
   "k":[
      {
         "i":1,
         "n":"NAME 1",
         "p":[
            {
               "b":"Event 1",
               "c":"00:00",
               "d":"03:00"
            },
            {
               "b":"Event 2",
               "c":"23:00",
               "d":"00:00"
            }
         ]
      },
      {
         "i":2,
         "n":"NAME 2",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      },
      {
         "i":3,
         "n":"NAME 3",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      }
   ]
}

Eu quero obter o conteúdo em "NAME 2" no Evento 1,2,3 com um script de Bash ( grep , awk , sed , etc.) (ou em Python em um script de Bash cmd ).

Eu quero o resultado da impressão:

NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
    
por tioma 20.08.2018 / 01:14

2 respostas

2

Você pode usar este Python para fazer o que quiser:

$ cat parse.py
#!/bin/python

import json
#from pprint import pprint

with open('content.json') as f:
  data = json.load(f)

for dict in data["k"]:
  if (dict["n"] == "NAME 2"):
    for elem in dict["p"]:
      print(dict["n"] + ' \ ' + elem["b"] + ' \ ' + elem["c"] + ' \ ' + elem["d"])

Exemplo

$ ./parse.py
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30
    
por 20.08.2018 / 08:29
0

Usando o analisador JSON da linha de comando jq ...

Pode haver uma expressão jq mais curta que faz isso, mas foi isso que eu criei:

$ jq -r --arg name "NAME 2" '.[][]|select(.n==$name).p[]|[$name,.[]]|join(" \ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

Ou, usando um código um pouco mais seletivo, como sugerido pelo steeldriver ,

$ jq -r --arg name "NAME 2" '.k[]|select(.n==$name).p[]|[$name, .b, .c, .d]|join(" \ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

name é uma variável jq cujo valor é passado na linha de comando. O código jq está fazendo cinco coisas:

  1. Extraia as matrizes k nos dados em que estamos interessados.
  2. Selecione o array específico que queremos gerar (e o p bit disso).
  3. Crie um array para a saída (já que o nome não faz parte dos dados, ele deve ser inserido).
  4. Do resultado com o delimitador particular inserido.
por 20.08.2018 / 08:24

Tags