文字列フィールドをjqの配列に分割しますか?

文字列フィールドをjqの配列に分割しますか?

次のように、カールから返されたJSON配列があります。

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

それに変換したいのですが…

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

これまで私は以下を持っています:

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

これは私に次のようなものを与えるようです:

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

.tagsしかし、元のオブジェクトの元の値を持つ配列として提供する出力に再編成することはできないようです...

ベストアンサー1

あなたは状況を実際よりもはるかに複雑にしています。ただ使用map()して|=

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

編集する:

次の方法でアイテムを処理したい場合tags

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

または、すべてのアイテムを変更せずに維持したい場合tags

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

結果:

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

おすすめ記事