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
各行のメール プロパティを表示したくないので、jq コマンドで何らかのフィルタリングを行う必要があることに注意してください。次のコードでは、名前と ID の単純なリストが表示されます。
list=$(echo "$data" | jq -r '.[] | .name, .id')
printf "$list"
問題は、テーブルのように表示できないことです。jq にはいくつかの書式設定オプションがあることは知っていますが、 を使用する場合のオプションほど優れているわけではprintf
ありません。これらの値を配列で取得し、それをループして書式設定を行えるようにしたいのですが...? 試したことでさまざまな結果が得られましたが、本当に欲しいものはありませんでした。
誰か私に正しい方向を指し示してくれませんか?
ベストアンサー1
フィルターの使用には@tsv
、多数の「エッジ ケース」を標準的な方法で処理できるという点が主な理由で、多くの利点があります。
.[] | [.id, .name] | @tsv
ヘッダーの追加は次のように行います。
jq -r '["ID","NAME"], ["--","------"], (.[] | [.id, .name]) | @tsv'
結果:
ID NAME
-- ------
12 George
18 Jack
19 Joe
@Tobia が指摘したように、column
jq によって生成された結果を後処理するために を使用して、テーブルを表示用にフォーマットする必要がある場合があります。bash のようなシェルを使用している場合は、column -ts $'\t'
非常に移植性が高いはずです。
length*"-"
破線の生成を自動化するには:
jq -r '(["ID","NAME"] | (., map(length*"-"))), (.[] | [.id, .name]) | @tsv'