web-dev-qa-db-ja.com

jq json出力から列を除外する

jq JSONプロセッサを使用して、ここでtimestampフィールドを削除します。

[
  {
    "timestamp": 1448369447295,
    "group": "employees",
    "uid": "elgalu"
  },
  {
    "timestamp": 1448369447296,
    "group": "employees",
    "uid": "mike"
  },
  {
    "timestamp": 1448369786667,
    "group": "services",
    "uid": "pacts"
  }
]

ホワイトリストも機能します。つまり、select uid, group

最終的に私が本当に欲しいのは、次のような一意の値を持つリストです。

employees,elgalu
employees,mike
services,pacts
28
Leo Gallucci

タイムスタンプを削除するだけの場合は、del()関数を使用できます。

_jq 'del(.[].timestamp)' input.json
_

ただし、目的の出力を実現するには、del()関数を使用しません。出力に表示するフィールドがわかっているので、配列にgroupidを入力し、join()関数を使用するだけです。

_jq -r '.[]|[.group,.uid]|join(",")' input.json
_

_-r_はraw ouputを表します。 jqは、値を引用符で囲みません。

出力:

_employees,elgalu
employees,mike
services,pacts
_
47
hek2mgl

記録として、代替案は次のようになります。

$ jq -r '.[] | "\(.uid),\(.group)"' input.json

(ホワイトリストのアプローチにより、順序の再配置が容易になり、このバリアントにより、間隔の変更などが容易になります。)

次の例は、安全なCSV(つまり、値にコンマまたは改行文字が埋め込まれている場合でも)を必要とするすべてのユーザーにとって興味深いものです。

$ jq -r '.[] | [.uid, .group] | @csv' input.json
"elgalu","employees"
"mike","employees"
"pacts","services"
5
peak