jq - imprime valores em uma linha

1

entrada json:

[
  {
    "name": "cust1",
    "grp": [
      {
        "id": "46",
        "name": "BA2"
      },
      {
        "id": "36",
        "name": "GA1"
      },
      {
        "id": "47",
        "name": "NA1"
      },
      {
        "id": "37",
        "name": "TR3"
      },
      {
        "id": "38",
        "name": "TS1"
      }
    ]
  }
]

esperado, na saída são duas linhas:

name: cust1
groups: BA2 GA1 NA1 TR3 TS1

Eu estava tentando criar um filtro sem sucesso ...

$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1

Atualização: a solução fornecida abaixo funciona bem, mas eu não previ o caso quando nenhum grupo existe:

[
  {
    "name": "cust1",
    "grp": null
  }
]

Nesse caso, a solução fornecida retorna erro:

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)

qualquer solução alternativa apreciada.

    
por Chris 23.06.2018 / 21:34

2 respostas

1

Ou use o join -j:

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1

E com um marcador:

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp//[{"name":"-"}]|.[]|" ",.name),"\n"' test_json
name: cust1
groups: -
    
por 23.06.2018 / 21:55
1
$ jq -r '.[]|
      [ "name:", .name ],
      [ "groups:", .grp[].name ]
      |@tsv' file.json
name:   cust1
groups: BA2     GA1     NA1     TR3     TS1

Ou seja, atribua @tsv duas matrizes, uma com o nome e outra com os grupos. Cada matriz se tornará sua própria linha.

Caso a matriz grp esteja vazia e você queira inserir um - :

$ jq -r '.[]|
      [ "name:", .name ],
      [ "groups:", (.grp // [])[].name // "-" ]
      |@tsv' file.jsonfile.json
name:   cust1
groups: -

Isso também tratará do caso em que grp está completamente ausente (não apenas uma matriz vazia).

    
por 23.06.2018 / 21:48

Tags