全力で怠けたい

怠けるために全力を尽くしたいブログ。

jq コマンドの Alternative operator: `//` が欠落値を代替できて便利。

jq コマンドの Alternative operator: // が欠落値を代替できて便利なのでメモしておく。

jq のバージョン。

$ jq --version
jq-1.6

使い方

学生の名簿がこんな感じの JSON になってるとき、age フィールドがあったら age フィールドを出力して age フィールドがなかったら 2022 - year_of_birth フィールドの計算結果を出力したい要件があるとする。

こんなときは // を使うととても簡潔に記述できる。便利。

$ cat students.json | jq
{
  "students": [
    {
      "name": "Alice",
      "age": 20
    },
    {
      "name": "Bob",
      "year_of_birth": 2001
    }
  ]
}

$ cat students.json | jq '.students[] | .age // 2022 - .year_of_birth'
20
21

age フィールドがなかったら 2022 - year_of_birth フィールドの計算結果を age フィールドに入れ込んだりもできる。

$ cat students.json | jq '.students[] | .age = (.age // 2022 - .year_of_birth)'
{
  "name": "Alice",
  "age": 20
}
{
  "name": "Bob",
  "year_of_birth": 2001,
  "age": 21
}

一応、if-then-else を使っても同じことができる。

$ cat students.json | jq '.students[] | if .age then .age = .age else .age = 2022 - .year_of_birth end'
{
  "name": "Alice",
  "age": 20
}
{
  "name": "Bob",
  "year_of_birth": 2001,
  "age": 21
}