1. ホーム
  2. json

[解決済み] JSON文字列をjqを使用してテーブルとしてフォーマットする方法は?

2022-03-11 02:38:32

質問

Bashスクリプトを始めたばかりで、JSONを扱うためにjqを偶然見つけました。

以下のようなJSON文字列をターミナルに出力するためにテーブルに変換する必要があります。

[{
    "name": "George",
    "id": 12,
    "email": "[email protected]"
}, {
    "name": "Jack",
    "id": 18,
    "email": "[email protected]"
}, {
    "name": "Joe",
    "id": 19,
    "email": "[email protected]"
}]

端末に表示させたいもの

ID        Name
=================
12        George
18        Jack
19        Joe

各行のemailプロパティを表示したくないので、jqコマンドで何らかのフィルタリングを行う必要があることに注意してください。以下のようにすると、名前とIDのプレーンなリストが得られます。

list=$(echo "$data" | jq -r '.[] | .name, .id')
printf "$list"

問題は、それを表のように表示できないことです。jqにはいくつかのフォーマットオプションがあるのは知っていますが printf . 私は、これらの値を配列で取得し、それをループして書式設定を行いたいと思うのですが・・・?私が試したものは、私に様々な結果を与えますが、私が本当に欲しいものは決してありません。

どなたか正しい方向を教えてください。

どのように解決するのですか?

のようなものではダメなのでしょうか?

echo '[{
    "name": "George",
    "id": 12,
    "email": "[email protected]"
}, {
    "name": "Jack",
    "id": 18,
    "email": "[email protected]"
}, {
    "name": "Joe",
    "id": 19,
    "email": "[email protected]"
}]' | jq -r '.[] | "\(.id)\t\(.name)"'

出力

12  George
18  Jack
19  Joe


編集1 : 細かい書式設定には awk

 echo '[{
    "name": "George",
    "id": 12,
    "email": "[email protected]"
}, {
    "name": "Jack",
    "id": 18,
    "email": "[email protected]"
}, {
    "name": "Joe",
    "id": 19,
    "email": "[email protected]"
}]' | jq -r '.[] | [.id, .name] | @csv' | awk -v FS="," 'BEGIN{print "ID\tName";print "============"}{printf "%s\t%s%s",$1,$2,ORS}'
ID  Name
============
12  "George"
18  "Jack"
19  "Joe"


編集2 : への返答として

配列を含む変数をそのまま取得する方法はないのでしょうか? jqから?

なぜダメなのか?

少し複雑な例ですが(実際、あなたのものを修正しました)、電子メールを配列に変更することで、これを実証しています。

echo '[{
    "name": "George",
    "id": 20,
    "email": [ "[email protected]" , "[email protected]" ]
}, {
    "name": "Jack",
    "id": 18,
    "email": [ "[email protected]" , "[email protected]" ]
}, {
    "name": "Joe",
    "id": 19,
    "email": [ "[email protected]" ]
}]' | jq -r '.[] | .email'

出力

[
  "[email protected]",
  "[email protected]"
]
[
  "[email protected]",
  "[email protected]"
]
[
  "[email protected]"
]