目次
やりたいことは
入力:example.jsonl1
{"name": "Gilbert"} {"name": "May"}
ここからnameを取り出して1つの配列にしたいです
[ "Gilbert", "May" ]
鍵となるのは--slurp(-s)オプション2!
jqを1回使う
JSON Linesを1つの配列にまとめ、各要素からキーの値を取り出して配列生成
% jq --slurp '[.[].name]' example.jsonl [ "Gilbert", "May" ]
--slurpにより、JSON Linesは1つの配列にまとまります。
参考:jqで連続するオブジェクトを配列にする #JSON - Qiita
% jq --slurp '.' example.jsonl
[
{
"name": "Gilbert"
},
{
"name": "May"
}
]
JSON Linesをまとめた配列について
jqを2回使う
他にもやり方は浮かびました。
あるキーの値を取り出してから、1つの配列にまとめる
% jq '.name' example.jsonl | jq --slurp '.' [ "Gilbert", "May" ]
.nameの出力を--slurpで1つの配列にまとめます
あるキーの値から配列を生成し、和を取った1つの配列にする
% jq '[.name]' example.jsonl | jq --slurp 'add' [ "Gilbert", "May" ]
まずnameから配列を生成します。
% jq '[.name]' example.jsonl [ "Gilbert" ] [ "May" ]
この配列を要素とする1つの配列を--slurpで作ります
% jq '[.name]' example.jsonl | jq --slurp '.'
[
[
"Gilbert"
],
[
"May"
]
]
jqのadd関数で要素の和をとります4。
2次の配列の要素(1次の配列)が繋がって、1つの配列となったわけです。
参考
終わりに
jqの--slurpオプションを使って、JSON Linesのあるキーの値を1つの配列にまとめられます。
--slurpで入力を1つの配列にまとめているのがミソですね。
--slurpを使うことで、PyTorchのTensorのunsqueezeっぽい動きになっているととらえました。
- かつてjqコマンドを完全に理解したときのデータを加工して用いました。↩
- 啜り入力 https://www.tohoho-web.com/ex/jq.html#opt-slurp↩
- 『jqハンドブック』のp.44 図3.1が分かりやすいです。角カッコにはいくつか意味があります(反復や配列生成)↩
- 『jqハンドブック』4.4.2 p.73 「add関数は配列内の要素の和を取ります。」↩
