こんな構造の JSON データを、
{
"a": "123",
"b": {
"bbb": "456",
"bcc": "789"
}
}
こう出力したいものとする。
"a","123"
"b.bbb","456"
"b.bcc","789"
やや無理やりだが jq でやりたくなったので書いた。
jq -c -r \
'def walk(k): k as $k | \
to_entries | \
.[] | \
{key: ($k + .key), value: .value} | \
.key as $key | \
( select(.value | type | .=="string") // (.value | walk($key + ".")) ); \
walk("") |\
[ .key, .value ] |\
@csv'
to_entries と walk関数
- to_entries で
key: value
を{ key: "key", value: "value" }
に変形する - select で
value
の値ごとに分岐させる。今回は「文字列だったらそのまま出力、そうでなかったら walk 関数を再帰呼び出し」としている。A // B
は AがなかったらBが評価されるショートサーキット的な動き。