web-dev-qa-db-fra.com

Exclure la colonne de la sortie jq json

Je voudrais me débarrasser du champ timestamp ici en utilisant jq processeur JSON.

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

La liste blanche fonctionnerait également pour moi, c'est-à-dire select uid, group

En fin de compte, ce que j'aimerais vraiment, c'est une liste avec des valeurs uniques comme celle-ci:

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

Si vous souhaitez simplement supprimer les horodatages, vous pouvez utiliser la fonction del():

jq 'del(.[].timestamp)' input.json

Cependant, pour obtenir la sortie souhaitée, je n'utiliserais pas la fonction del(). Puisque vous savez quels champs doivent apparaître dans la sortie, vous pouvez simplement remplir un tableau avec group et id, puis utiliser la fonction join():

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

-r Signifie sortie brute. jq n'imprimera pas de guillemets autour des valeurs.

Production:

employees,elgalu
employees,mike
services,pacts
47
hek2mgl

Pour mémoire, une alternative serait:

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

(L'approche de liste blanche facilite la réorganisation de la commande, et cette variante facilite la modification de l'espacement, etc.)

L'exemple suivant peut intéresser tous ceux qui souhaitent un CSV sûr (c'est-à-dire même si les valeurs ont des virgules ou des caractères de nouvelle ligne intégrés):

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