cClaude.rocks ☕ Le blog

L'informatique et les nouvelles technologies

Menu

Sous Linux, avec un dérivé de Debian ou d’Ubuntu comme Linux Mint, la commande jq s’installe l’aide :

sudo apt install jq

Imaginons le flux JSON suivant :

[
  {
    "name": "George",
    "id": 12,
    "email": "george@domain.com"
  },
  {
    "name": "Jack",
    "id": 18,
    "email": "jack@domain.com"
  },
  {
    "name": "Joe",
    "id": 19,
    "email": "joe@domain.com"
  }
]

Pour obtenir et tester ce flux, vous pouvez utiliser :

echo '[{"name":"George","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]'

ou mieux (puisque cela vérifie que vous n’avez pas fait d’erreur) :

jq . <<<'[{"name":"George","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]'

Obtenir un joli tableau avec @tsv :

Syntaxe jq

On utilise le script embarqué @tsv et on crée le tableau comme suit.

jq -r '["ID","NAME"], ["--","------"], (.[] | [.id, .name]) | @tsv'
  • ["ID","NAME"] – Correspond à la description de l’entête
  • ["--","------"] – Est une ligne pour séparer l’entête du reste du tableau
  • (.[] | [.id, .name]) – Prend le tableau JSON initial et pour chaque entrée ne garde que les valeurs id et name.

Exemple complet

jq -r '["ID","NAME"], ["--","------"], (.[] | [.id, .name]) | @tsv' <<<'[{"name":"George","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]'

Résultat :

ID  NAME
--  ------
12  George
18  Jack
19  Joe

Mais l’affichage n’est pas parfait…

Syntaxe jq

jq -r '["ID","NAME","MAIL"], ["--","------","---"], (.[] | [.id, .name, .email]) | @tsv'

Exemple complet

 jq -r '["ID","NAME","MAIL"], ["--","------","---"], (.[] | [.id, .name, .email]) | @tsv' <<<'[{"name":"George avec un nom très long","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]'

Résultat :

ID  NAME    MAIL
--  ------  ---
12  George avec un nom très long    george@domain.com
18  Jack    jack@domain.com
19  Joe joe@domain.com

Il y a deux problèmes majeurs :

  • d’une part, il faut gérer la ligne dessous l’entête à la main,
  • d’autre part les colonnes ne sont pas alignées.

Production automatique des tirets

La magie de la commande jq : length*"-"

Pour automatiser la création des lignes avec un tiret :

Syntaxe jq

jq -r '(["ID","NAME","MAIL"] | (., map(length*"-"))), (.[] | [.id, .name, .email]) | @tsv'

Exemple complet

jq -r '(["ID","NAME","MAIL"] | (., map(length*"-"))), (.[] | [.id, .name, .email]) | @tsv' <<<'[{"name":"George avec un nom très long","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]'

Résultat :

ID   NAME    MAIL
--  ----    ----
12  George avec un nom très long    george@domain.com
18  Jack    jack@domain.com
19  Joe joe@domain.com

Utilisation de column

Syntaxe jq et column

jq -r '(["ID","NAME","MAIL"] | (., map(length*"-"))), (.[] | [.id, .name, .email]) | @tsv' | column -ts $'\t'

Exemple complet

jq -r '(["ID","NAME","MAIL"] | (., map(length*"-"))), (.[] | [.id, .name, .email]) | @tsv' <<<'[{"name":"George avec un nom très long","id":12,"email":"george@domain.com"},{"name":"Jack","id":18,"email":"jack@domain.com"},{"name":"Joe","id":19,"email":"joe@domain.com"}]' | column -ts $'\t'

Résultat :

ID  NAME                          MAIL
--  ----                          ----
12  George avec un nom très long  george@domain.com
18  Jack                          jack@domain.com
19  Joe                           joe@domain.com

Références

ᦿ


ℹ 2006 - 2021 | 🕸 Retour à l'accueil du domaine | 🏡 Retour à l'accueil du blog