JSON:値がパターンに一致するキーと値のペアを抽出して印刷します。

JSON:値がパターンに一致するキーと値のペアを抽出して印刷します。

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/" }
]

...キーに直接アクセスしてください。

配列はオブジェクトのセットに展開され、格納された[]値はセット内の各オブジェクトの一部と共に引用された$nCSV出力に変換される配列を作成するために使用されます。.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
)[]

おすすめ記事