LoginSignup
0
0

jq 1.7の新機能ーpick

Last updated at Posted at 2024-02-13

JSON処理のコマンドラインツールであるjqが、5年ぶりにアップデートしました。現在の最新は1.7.1(2023年12月リリース)です。1.6からいろいろと改定や新機能の追加があって、ますます楽しくなっています。

全容はGithub上のリリースノートを見ていただくとして、今日は新機能のpickを試してみます。この関数はSQLの射影を実装したものです(SELECT シリアルコード FROM データベースのようにテーブルの特定のコラムだけを抽出する操作)。

オブジェクトを対象にした例題には、次のGithubのREST APIを使います。

$ curl -s https://api.github.com/users/octocat
{
  "login": "octocat",
  "id": 583231,
  ︙
  "created_at": "2011-01-25T18:44:36Z",
  "updated_at": "2024-01-22T12:23:59Z"
}

これまでは

オブジェクトから特定のプロパティ値だけを抜き出すのは簡単です。たとえば、上記からloginプロパティ値だけを抜き出すならこうです。

$ curl -s https://api.github.com/users/octocat | jq '.login'
"octocat"

しかし、プロパティ名も含めてオブジェクトとして抽出したいとなると、with_entriesというやや面妖な関数をselectと組み合わせて使わなければなりません。

$ curl -s https://api.github.com/users/octocat | jq 'with_entries(select(.key == "login"))'
{
  "login": "octocat"
}

プロパティ1つくらいならたいしたことないですが、複数を選択するとなると、selectが混雑して読みづらくなります。

これからは

pickは引数に指定されたパス表記(.login.[1]など)のオブジェクトをそのまま抽出する関数です。上記は次のようにシンプルに書けます。

$ curl -s https://api.github.com/users/octocat | jq 'pick(.login)'
{
  "login": "octocat"
}

当然、v1.7以前では動作しません。

$ jq-1.6 --version
jq-1.6

$ curl -s https://api.github.com/users/octocat | jq-1.6 'pick(.login)'
jq: error: pick/1 is not defined at <top-level>, line 1:
pick(.login)
jq: 1 compile error

配列だと

pickは配列でも使えますが、やや癖があります。5要素からなる配列から1番目と3番目の要素を抽出しようとします(要素番号は0からカウント)。

$ echo '[0, 1, 2, 3, 4]' | jq 'pick(.[1,3])'
[
  null,
  1,
  null,
  3
]

どうやら、0番目から指定の要素番号の最大のところまでnullで埋まった配列を用意し、抽出したものだけはその位置でその値で埋めるようです。ここでは3番目が最大の要素番号なので4つのnullで埋まった配列ができ、そこに1番目と3番目だけはもともとの値で埋まります。

おそらく、この関数は要素位置を温存したいときに効力を発揮するようです。[1, 3]のように抽出した要素だけに縮退させたいのなら、nullを別途省きます。

$ echo '[0, 1, 2, 3, 4]' | jq 'pick(.[1,3]) | map(select(. != null))'
[
  1,
  3
]

でも、そこまでするくらいなら、角括弧が連続して読みにくいものの、これまでどおり、抽出結果を[]でくくって配列化したほうが早いでしょう。

$ echo '[0, 1, 2, 3, 4]' | jq '[ .[1, 3] ]'
[
  1,
  3
]

おわりに

他にも、数値の精度が上がるなど、細かいところで性能向上も図られています。まだ1.6をお使いなら、これを機会に1.7にアップグレードしましょう。

参考

表紙 表紙

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0