jq で JSON を LTSV に変換する
結論
[
{"foo": "bar1", "hoge": "piyo1"},
{"foo": "bar2", "hoge": "piyo2"},
{"foo": "bar3", "hoge": "piyo3"}
]
という json(test.json とする) があるときに、
$ cat test.json | jq -r '.[] | to_entries | map("\(.key):\(.value)") | join("\t")'
と実行すると、
foo:bar1 hoge:piyo1 foo:bar2 hoge:piyo2 foo:bar3 hoge:piyo3
と出力されます。
解説
分解して説明します。
to_entries で key, value という key を持った hash の array に変換します。
$ cat test.json | jq -r '.[] | to_entries'
[
{
"key": "foo",
"value": "bar1"
},
{
"key": "hoge",
"value": "piyo1"
}
]
[
{
"key": "foo",
"value": "bar2"
},
{
"key": "hoge",
"value": "piyo2"
}
]
[
{
"key": "foo",
"value": "bar3"
},
{
"key": "hoge",
"value": "piyo3"
}
]
map は配列に対して処理を行え、
"(\.KEY)" で文字列変数展開ができるので、
map("\(.key):\(.value)") として Label:Value の形式に変換します。
$ cat test.json | jq -r '.[] | to_entries | map("\(.key):\(.value)")'
[
"foo:bar1",
"hoge:piyo1"
]
[
"foo:bar2",
"hoge:piyo2"
]
[
"foo:bar3",
"hoge:piyo3"
]
最後に、join("\t") で array を Tab 区切りの文字列に変換して完了です。
謝辞
http://stackoverflow.com/a/25378171 をちょっといじっただけです。
とても助かりました。aioobe さん、ありがとうございます!