JSON:
"{
"a": "https://is2-ssl.com/",
"b": "https://a5.-ssl.com/",
"type": "response",
"c": [
{
"Number": 1,
"Reportname": "XXX",
"size": "2.5",
"Variants": [
"YYY"
]
}
],
"Meta": "ABC"
}
希望の出力:
XXX,a,https://is2-ssl.com/
XXX,b,https://a5.-ssl.com/
値に「http」(url)を含むキーと値のペアを印刷し、キーと値を区切り文字「、」にマージして、ReportNameを追加したいと思います。
ベストアンサー1
"
JSONドキュメントの最初の文字の綴りが間違っているので、次のように.ReportName
したいとしましょう。最初アイテムを配列にし、c
出力をCSVにしたいです。
$ jq -r '.c[0].Reportname as $n | map_values(select(type == "string" and startswith("http"))) | to_entries[] | [$n, .key, .value] | @csv' file
"XXX","a","https://is2-ssl.com/"
"XXX","b","https://a5.-ssl.com/"
表現方式jq
:
.c[0].Reportname as $n |
map_values(select(type == "string" and startswith("http"))) |
to_entries[] | [$n, .key, .value] | @csv
まず、値を選択して.Reportname
内部jq
変数に割り当てます$n
。次に、substringで始まる文字列に関連付けられていないキーを削除して元のオブジェクトを再構築しますhttp
。
サンプル文書はmap_values()
次のように縮小されます。
{
"a": "https://is2-ssl.com/",
"b": "https://a5.-ssl.com/"
}
次にそれをto_entries
等価に変換します。
[
{ "key": "a", "value": "https://is2-ssl.com/" },
{ "key": "b", "value": "https://a5.-ssl.com/" }
]
...キーに直接アクセスしてください。
配列はオブジェクトのセットに展開され、格納された[]
値はセット内の各オブジェクトの一部と共に引用された$n
CSV出力に変換される配列を作成するために使用されます。.key
.value
@csv
jq
同じ出力を持つ別の式ですが、以前に実行された次のように、オブジェクトの値の代わりに生成されたto_entries
配列map()
に対して操作を実行します。map_values()
.c[0].Reportname as $n |
to_entries |
map(
select(.value | type == "string" and startswith("http")) |
[$n, .key, .value] | @csv
)[]