jq で条件に一致する要素を取得して再度配列に変換するメモ

この記事は 2023年 ゆるくすすめる ( ワンフットシーバス ) GWアドベントカレンダー の 1 日目の記事です。

jq で条件に一致する要素を取得して再度配列に変換するメモです。

参考にするデータ

[
    {
      "type": "home",
      "number": "0203 544 1234"
    },
    {
      "type": "office",
      "number": "01962 001234"
    },
    {
      "type": "office",
      "number": "01962 001235"
    },
    {
      "type": "mobile",
      "number": "077 7700 1234"
    }
]

こちらで検索を普通にかけるとバラバラに返ってきてしまう

jq '.[] | select(.type == "office")' sample.json

このようにかけると、

{
  "type": "office",
  "number": "01962 001234"
}
{
  "type": "office",
  "number": "01962 001235"
}

と返ってきてしまってバラバラにオブジェクトが並んでしまうので、配列の個数を数えたいときに困ります。

うっかり jq '.[] | select(.type == "office")' sample.json | jq '. | length' のようにやろうものなら、

2
2

と返ってきてしまい、オブジェクトの中の値が 2 つあるという意味合いの返答が 2 オブジェクトぶん並ぶという謎なことになります。

このときな -s で配列に戻す

jq コマンドで検索と整形 – Qiita

こちらの記事の -s パラメータで「条件に一致する要素を取得して再度配列に変換」というのが求めていたやり方でした。ありがとうございます!

jq '.[] | select(.type == "office")' sample.json | jq -s

こうすると、

[
  {
    "type": "office",
    "number": "01962 001234"
  },
  {
    "type": "office",
    "number": "01962 001235"
  }
]

とくるので、

jq '.[] | select(.type == "office")' sample.json | jq -s '. | length'

'. | length' を加えれば、さらに該当した個数をカウントできます。この場合は 2 が返ってきます。