#jq コマンドむずい。オブジェクトの配列から、任意のキーを指定してフィルタし、新しいオブジェクトの配列を組み立て直そうとして失敗した例。


  • 配列の持つオブジェクト内で
  • a というキーを持つ value を
  • x というキー に差し替えて
  • 再び配列に収める

ということをやりたい

json

[
  {
    "a": 1,
    "b": 2,
    "c": 3
  },
  {
    "a": 3,
    "b": 4,
    "c": 5
  }
]

exe

キーが一つならうまくいく

$ echo '[{"a" : 1, "b" : 2, "c" : 3},{"a" : 3, "b" : 4, "c" : 5}]' | jq '[{"x": .[].a}]'
[
  {
    "x": 1
  },
  {
    "x": 3
  }
]

# exe

キーが複数だとこれだ!
なんだか組み合わせの数だけ増えているような気がするな?
べき乗っぽいぞ!

$ echo '[{"a" : 1, "b" : 2, "c" : 3},{"a" : 3, "b" : 4, "c" : 5}]' | jq '[{"x": .[].a, "y" : .[].a, "z" : .[].a}]' | pbcopy

[
  {
    "x": 1,
    "y": 1,
    "z": 1
  },
  {
    "x": 1,
    "y": 1,
    "z": 3
  },
  {
    "x": 1,
    "y": 3,
    "z": 1
  },
  {
    "x": 1,
    "y": 3,
    "z": 3
  },
  {
    "x": 3,
    "y": 1,
    "z": 1
  },
  {
    "x": 3,
    "y": 1,
    "z": 3
  },
  {
    "x": 3,
    "y": 3,
    "z": 1
  },
  {
    "x": 3,
    "y": 3,
    "z": 3
  }
]

exe

$ echo '[{"a" : 1, "b" : 2, "c" : 3},{"a" : 3, "b" : 4, "c" : 5}]' | jq '[{"x": .[].a, "y" : .[].a, "x" : .[].a, "a" : .[].a}]'

[
  {
    "x": 1,
    "y": 1,
    "a": 1
  },
  {
    "x": 1,
    "y": 1,
    "a": 3
  },
  {
    "x": 3,
    "y": 1,
    "a": 1
  },
  {
    "x": 3,
    "y": 1,
    "a": 3
  },
  {
    "x": 1,
    "y": 3,
    "a": 1
  },
  {
    "x": 1,
    "y": 3,
    "a": 3
  },
  {
    "x": 3,
    "y": 3,
    "a": 1
  },
  {
    "x": 3,
    "y": 3,
    "a": 3
  },
  {
    "x": 1,
    "y": 1,
    "a": 1
  },
  {
    "x": 1,
    "y": 1,
    "a": 3
  },
  {
    "x": 3,
    "y": 1,
    "a": 1
  },
  {
    "x": 3,
    "y": 1,
    "a": 3
  },
  {
    "x": 1,
    "y": 3,
    "a": 1
  },
  {
    "x": 1,
    "y": 3,
    "a": 3
  },
  {
    "x": 3,
    "y": 3,
    "a": 1
  },
  {
    "x": 3,
    "y": 3,
    "a": 3
  }
]

Original by Github issue