目次
やりたいことは
入力: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関数は配列内の要素の和を取ります。」↩