nikkie-ftnextの日記

イベントレポートや読書メモを発信

JSON Linesのあるキーの値を、jqコマンドで1つの配列にまとめる

目次

やりたいことは

入力: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をまとめた配列について

  • 1つ1つのJSON.[])について、nameの値を取り出し(.name
  • 外側の[ ... ]で1つの配列を生成します3

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っぽい動きになっているととらえました。


  1. かつてjqコマンドを完全に理解したときのデータを加工して用いました。
  2. 啜り入力 https://www.tohoho-web.com/ex/jq.html#opt-slurp
  3. 『jqハンドブック』のp.44 図3.1が分かりやすいです。角カッコにはいくつか意味があります(反復や配列生成)
  4. 『jqハンドブック』4.4.2 p.73 「add関数は配列内の要素の和を取ります。