Quelques pistes pour gérer des tableaux à partir d'un flux JSON.
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 la méthode @tsv
de jq pour créer 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 tableauJSON
initial et pour chaque entrée ne garde que les valeursid
etname
.
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
኿