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
}