Dividir um campo sting em um array em jq?

3

Eu tenho uma matriz json retornada da onda que se parece com isso:

[
 {
   "title": "Some Title",
   "tags":"tagA tag-B tagC"
 },
 {
   "title": "Some Title 2",
   "tags":"tagA tagC"
 },
 ...
]

Eu gostaria de convertê-lo para ...

[
 {
   "title": "Some Title",
   "tags":["tagA",
           "tag-B",
           "tagC"]
 },
 {
   "title": "Some Title 2",
   "tags":["tagA", 
           "tagC"]
 },
 ...
]

Até agora eu tenho:

(map(select(.tags!=null)) | map(.tags | split(" "))) as $tags | $tags

e isso parece me dar algo como:

     [
      [
       "tagA",
       "tag-B",
       "tagC"
      ],
      [
       "tagA", 
       "tagC"
      ]
     ]

Mas não pareço ser capaz de tecer isso de volta em uma saída que me daria .tags como uma matriz nos objetos originais com os valores originais ...

    
por leeand00 10.06.2017 / 05:00

2 respostas

5

Você está tornando muito mais complicado do que é. Basta usar map() e |= :

jq 'map(.tags |= split(" "))' file.json

Editar:

Se você deseja manipular entradas sem tags :

jq 'map(try(.tags |= split(" ")))' file.json

Como alternativa, se você quiser manter inalteradas todas as entradas sem tags :

jq 'map(try(.tags |= split(" ")) // .)' file.json

Resultado:

[
  {
    "tags": [
      "tagA",
      "tag-B",
      "tagC"
    ],
    "title": "Some Title"
  },
  {
    "tags": [
      "tagA",
      "tagC"
    ],
    "title": "Some Title 2"
  }
]
    
por 10.06.2017 / 10:20
-2

Você pode tentar isso é sed da seguinte forma:

O código abaixo está usando a versão GNU do sed (embora possa ser portably escrito em POSIX-compatível também)

sed -e '
   /[{]/,/[}]/!b
   /"tags":/!b

   h;s/"tags":/&\n/;s/\n.*/ /;s/./ /g;x

   s/"tags":/&\n/
   :a
   s/\(\n.*\)\([^"]\) \([^"]\)/","/;ta

   y/\n/[/;s/$/]/;G

   :b
   s/","\(.*\)\(\n.*\)/","/;tb
   s/\(.*\)\n.*//

' yourjsonfile

Trabalhando

  1. Selecionamos o intervalo como { para as próximas } linhas.
  2. Aumente o zoom na linha "tags" no intervalo selecionado.
  3. Calcule os espaços de aninhamento da tag dada e armazene-a em espera.
  4. Cite duas vezes os dados da tag em um loop :a
  5. Insira os espaços de aninhamento após o , em um loop :b
  6. Remover tudo após a última nova linha no espaço padrão & imprimir.

Resultados

[
 {
   "title": "Some Title",
   "tags":["tagA",
           "tag-B",
           "tagC"]
 },
 {
   "title": "Some Title 2",
   "tags":["tagA",
           "tagC"]
 },
 ...
]
    
por 10.06.2017 / 06:05

Tags