■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、一部を除いてインターネット上のダウンロードサービスからダウンロードすることができます。詳しい手順については、本書の巻末にある袋とじの内容をご覧ください。
なお、ダウンロードサービスのご利用にはユーザー登録と袋とじ内に記されている番号が必要です。そのため、本書を中古書店から購入されたり、他者から貸与、譲渡された場合にはサービスをご利用いただけないことがあります。あらかじめご承知おきください。

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめに

jq は、JSON からほしいデータだけをさくっと抽出するコマンドライン指向のツールです。RESTAPI の応答をそのままパイプ経由で処理できるため、DevOps や NetOps に好んで利用されています。
たとえば、Github から octocat のリポジトリのリストを得るなら、次のようにするでしょう。
$ curl -s https://api.github.com/users/octocat/repos | jq -r '.[].name'boysenberry-repo-1
git-consortium
hello-worId
Hello-World

︙

jq はしかし、値を抜き出すだけのツールではありません。他のテキスト処理ツールと比べても遜色のない機能が備わっているので、日付文字列を変換する、2 つの配列から共通要素を探すな
どの操作もできます。while や if などの制御構造や変数定義の機能もあるので、プログラミングらしいこともできます。関数を作成して呼び出すといった、シェルスクリプト的な使い方も可能です。

とは言え、jq は根源的に、フィルタの処理結果を次のフィルタに入力することで段階的に入力を変形していくパイプライン処理メカニズムです。一般のスクリプト言語にはない制約やスタイル
があり、awk などと比べるとわかりにくいところがあります。

本書は、値の抽出にとどまらないこれら jq の高度な使い方を紹介します。複雑な JSON テキス

トの処理を jq 単体で書けるようになるのが目標です。不要な行の削除や出力の調整は grep などのおなじみのツールに任せてパイプで組み合わせることもできますが、1 つの処理系だけで書ければ、メンテナンスや共有が楽になります。

本書では、各種の問題に対するレシピを jq の関数の形で提示します。読者はそれら関数をそのまま利用してもよいですが、本書の主たる目的は、類似の問題を自力で解決できるよう、jq のコーディングパターンを理解するところにあります。もちろん、すべてのユースケースを紹介できる
わけはありませんし、掲載した解法よりも美しい方法もあるでしょうが、主要なコーディング上の疑問には答えられるのではと思っています。

iii

本書は、ある程度まで jq を使い込んだ読者をターゲットとしています。ベーシックな用法は、

導入篇の『jq ハンドブック』（カットシステム、2021 年）、あるいは次に示すオフィシャルな jq
マニュアルを参照してください。

https://stedolan.github.io/jq/manual/v1.6/

jq のコマンドオプション、特殊記号、演算子、関数、定数は、筆者の次の Github ページにまと

めてあります。リファレンスとしてご参照ください。
https://github.com/stoyosawa/jqDoc-public

JSON を日常的に利用する NetOps や DevOps 諸氏のお役に立てれば幸いです。
2023 年 3 月
豊沢 聡

iv

本書の利用法
本書の各節では、設定した問題、その解法である jq の関数、その用法と説明を示します。たとえば、「オブジェクトのプロパティ名と値を入れ替えたい」という問題に対しては、次の関数を提供します［レシピ O03］。
def swap_property:

with_entries({"key": (.value | tostring), "value": .key});関数は章単位にまとめたファイルに収容したので、include（あるいは import）ディレクティブからファイルを読み込めば、呼び出せます。次の例では、ファイル object.jq に収容した上記の
swap_property 関数を呼び出しています。

$ echo '{"キー":"値"}' | jq 'include "object"; swap_property'{}"値": "キー"自作関数もビルトイン同様に利用できるので、ビルトインのフィルタと組み合わせられます。たとえば、上記のオブジェクトからプロパティ値を抜き出すには、次のようにします。
$ echo '{"キー":"値"}' | jq 'include "object"; swap_property | ."値"'"キー"

jq 関数はポピュラーな話題ではないので、付録 A で作成方法と注意事項を示しました。慣れない方は先にそちらをお読みください。

関数呼び出しが望まれないときは、def 以下のブロックをコピーして使えます。関数と言っても、中身はコマンドラインで記述するフィルタと変わりありません（単にまとめているだけなのはシェルスクリプトの関数と同じです）。ただし、末尾のセミコロン ; は関数定義の末尾を示すデリ

ミタなので、直接利用のときは外します。

ここにあったセミコロンは抜く ↓#$ echo '{"キー":"値"}' | jq 'with_entries({"key":(.value|tostring), "value":.key})'{}"値": "キー"v複数行の関数も、単一引用符でくくられていれば、インデントや改行込みのままコピーペースト
で使えます。次に示すのは N の階乗（N!）を計算する手すさび関数ですが［レシピ F02］、これもdef 以下の行をフィルタを記述する箇所にそのまま張り込むだけです。

# 関数定義def factorial:
tonumber |reduce range(1; .+1) as $n (1;

. * $n);$ echo 10 | jq '>>>>tonumber |reduce range(1; .+1) as $n (# そのままコピペ

1;)'. * $n3628800# 閉じ単一引用符を忘れずに
# 10!

本書の構成
本書は、JSON データ型単位に章立てしています。ただし、null や真偽値に関する問題は数が少ないので、独立した章にはしていません。たとえば、「空の値ならすべて null と判断する」という問題は、「空の値」に 0 も含んでいるので、数値を扱う第 1 章で取り上げています。また、配列についてはジャンルに分けて 4 つの章で扱います。
関数は、それぞれの章につき 1 つのファイルにまとめています。たとえば、第 1 章の関数はファイル number.jq に定義しています。

レシピ番号は章タイトルに「近い」アルファベット 1 文字を先頭にして順に付けています（先頭文字に重なりが多いので苦し紛れのものもいくつかあります）。第 1 章の 10 番目のレシピはN10 です。

vi

各章の概要を次表に示します。
章番号

内容

第1章

数値関連

第2章

文字列関連

第3章

配列関連

第4章

集合関連（配列）第5章

統計関連（配列）

第6章

オブジェクト関連

第7章

SQL 関連（配列）第8章

アルゴリズム関連（手すさび）

第9章

その他

付録 A

関数定義の説明

付録 B

ビルトイン関数の用法

付録 C

関数ファイル

レシピ番号

number.jq

N01 ～ N20

array.jq

A01 ～ A19

string.jq
set.jqstat.jq

object.jq
sql.jqfun.jqothers.jq
sample.jq

S01 ～ S25
M01 ～ M10
E01 ～ E08
O01 ～ O13
Q01 ～ Q19
F01 ～ F08
T01 ～ T06
番号なし

‐

‐

用語集

‐

‐

付録 D

記号一覧

‐

‐

付録 E

本書の関数の一覧‐‐

第 4 章、第 5 章、第 7 章は、第 3 章と同じく配列が対象です。ただ、第 4 章は配列を集合、第5 章は配列を実験データなどの数値の羅列、第 7 章はオブジェクトの配列をデータベースの「テーブル」としてそれぞれ見立て、その手法を用いたレシピを掲載しています。たとえば、第 4 章では 2 つの配列の積集合（intersection）を、第 5 章では配列の値の標準偏差（stdev）を、第 7 章
ではテーブルに対する SELECT や UPDATE を取り上げます。

第 8 章は手すさびの章です。ここにはフィボナッチ数列や素数列の計算など、jq でやろうとは思わないアルゴリズムなレシピを収録しています。遊びではありますが、根源的にパイプライン
処理マシンである jq で複雑な問題に取り組むときのコーディングパターンを感じ取れると思います。再帰呼び出しも紹介します。

jq の 高 度 な 関 数（map や with_entries） の 用 法 は 付 録 B で 補 足 説 明 し ま し た。jq あ る い はJSON 固有の用語（「エントリー化」や「パス配列」）は付録 C に、jq で多用される特殊記号（[]や .）は付録 D にまとめたので、参考にしてください。

関数ファイルは出版社のダウンロードサービスからダウンロードできます。

vii

注意事項
以下、本書で使用するサンプルファイルや表記などで注意すべき点を説明します。

jq のバージョン

本書で使用し、動作を確認した jq は現在最新のバージョン 1.6（2018 年 11 月 1 日リリース）です。jq のバージョンは --version コマンドオプションから確認できます。
$ jq --version
jq-1.6

ディストリビューションによっては、正規表記ライブラリ抜きでコンパイルされたものもあります。抜きでビルドされたかは、次のように正規表現フィルタを試すことで確認できます（入力文字
列が正の整数なら true を返す）。

$ jq -n '"17" | test("^\\d+$")'

jq: error (at <stdin>:0): jq was compiled without ONIGURUMA regex library.
match/test/sub and related functions are not available

とくに理由がなければ、1.6 の正規表現付きのものをインストールしてください。

jq マニュアルはバージョン毎に分かれています。トップページの［Manual］からアクセスすると次図のように開発版の「jq Manual (develpoment version)」が表示されます。一部 1.6 にはない機能も記述されているので、1.6 のものを参照してください。

viii

対象環境
JSON および jq はプラットフォーム独立なので、実行環境は問いません。しかし引用符やエス

ケープ文字の扱いに癖のあるコマンドライン環境もあります。そのため、本書では Unix（あるいは Windows Subsystem for Linux）のみを使用しています。たとえば、フィルタをくくる引用符には単一引用符 ' を使っています。

Windows で利用できないわけではありませんが、くくり文字に二重引用符 " を使う（単一引用符は使えません）、引用内部の二重引用符（JSON 文字列のくくり）を適切に扱うなど、コマンド
プロンプトでの使用で配慮が必要です。

サンプルの入力
用例の JSON テキストは、短いものなら echo コマンドから、あるいは -n（ロングフォーマット

は --null-input）を用いてフィルタ内部の即値から入力します。次の例は、3.1415 を入力し、その正弦関数値を求めています。
$ echo 3.1415 | jq 'sin'# echoから入力$ jq -n '3.1415 | sin'

# -nから即値で入力

9.265358966049026e-05
9.265358966049026e-05

長いものは事前に掲載し、実行時では入力部分を次のように ... で省いて示します。
$ ... | jq 'include "stats"; stdev'

これら長いサンプルは、ファイル function.json にオブジェクトプロパティとして収容してあります。これも出版社のダウンロードサービスからダウンロードできます。中身を一部示します。
$ cat function.json{

︙"sake_table": [["獺祭", "東洋美人", "五橋", "富久寿", "五橋"],["磯自慢", "志田泉", "喜久酔", "花の舞"],],["十四代", "上喜元", "出羽桜", "初孫"]

ix

︙
︙

"stats": [44, 40, 42, 44, 44, 42, 40, 44, 45, 44],}

利用にあたっては、jq .stats function.json のように個々のプロパティを選択的に抽出します。次に、プロパティ .sake1 の値（配列）を用いるときの例を示します。
$ jq '.sake1' function.json
[

"獺祭",

"東洋美人","五橋","富久寿",]"五橋"

構造上の制限から function.json に収容できなかったサンプルファイル（1 行 1 行が独立した

JSON テキストなファイルなど）もありますが、これらもレシピでその都度説明を加えています。

もっとも、ファイルの中身そのものに意味があるわけではないので、似たような構造なら好みのJSON テキストでテストしても問題はありません。

実行例
基本は全出力の掲載ですが、さしさわりのない長いものはドット（︙や ...）で省略しています。
jq のデフォルト出力フォーマットそのままでは読みにくいものは、-c コマンドプロンプト（ロングフォーマットは --compact-output）あるいは -r（--raw-output）を介しています。それでもまだ読みにくいものは、手で整形しています。実行例をそのまま実行してもまったく同じ出力にならないものもある点、ご注意ください。

コメント
本書に記載したサンプルおよび実行例の JSON テキストには、ハッシュ # を先付けした筆者の注釈が加えられているものもあります。あくまで参考のためです。JSON テキストにはコメントは記述できないので、そのままコピーすると、# 部分がエラーになります。

jq フィルタはコメントを受け付けます。# 以降が行末まで無視されるので、行単位で書かれた

関数コードでは有効ですが、コマンドラインから 1 行で記述するフィルタでは実用上利用できま
せん。目次
x

目

次

目次
はじめに ......................................................................................................................................................... iii

第1章

数値関数 ..............................................................1

N01 	 πを得る ......................................................................................................................................... 1
N02 	 e を得る .......................................................................................................................................... 2
N03 	 ラジアンを角度に変換する .................................................................................................... 3
N04 	 角度をラジアンに変換する .................................................................................................... 4
N05 	 絶対値を計算する ...................................................................................................................... 5
N06 	 整数のビット長を返す ............................................................................................................. 5
N07 	 10 進数を N 進数に変換する ................................................................................................. 7
N08 	 10 進数を 2 進数に変換する . ................................................................................................ 9
N09 	 10 進数を 16 進数に変換する ............................................................................................ 10
N10 	 10 進数を 16 進数文字に変換する ................................................................................... 11
N11 	 N 進数を 10 進数に変換する .............................................................................................. 13
N12 	 真偽値を数値に変換する ...................................................................................................... 15
N13 	 空の値ならすべて null と判断する . ................................................................................. 17
N14 	 数値が整数なら真を返す ...................................................................................................... 19
N15 	 数字からカンマを外す .......................................................................................................... 20
N16 	 数値にカンマを挿入する ...................................................................................................... 22
N17 	 すべての数値を抜き出す ...................................................................................................... 24
N18 	 引数指定の方法ですべての値を抜き出す ...................................................................... 26
N19 	 小数点数を指定の桁数で丸める ........................................................................................ 28
N20 	 Unix エポック時刻を ISO 8601 フォーマットに変換する ..................................... 30

第2章

文字列関数 .........................................................33

S01 	 文字の Unicode コードポイントを得る .......................................................................... 33
S02 	 Unicode コードポイントから文字を得る ...................................................................... 35xi

S03 	 文字列の数値への変換 .......................................................................................................... 36
S04 	 先頭を大文字にする ............................................................................................................... 38
S05 	 タイトル文字化する ............................................................................................................... 39
S06 	 文字列を逆順にする ............................................................................................................... 42
S07 	 大文字小文字を入れ替える ................................................................................................. 43
S08 	 文字列を左揃えにする .......................................................................................................... 44
S09 	 文字列を右揃えにする .......................................................................................................... 47
S10 	 文字列の左右揃えを選択的にする .................................................................................... 47
S11 	 文字列を中央揃えする .......................................................................................................... 50
S12 	 左側の空白文字を取り除く ................................................................................................. 51
S13 	 右側の空白文字を取り除く ................................................................................................. 52
S14 	 左右の空白文字を取り除く ................................................................................................. 52
S15 	 米国表記の日付を変換する ................................................................................................. 53
S16 	 英国表記の日付を変換する ................................................................................................. 55
S17 	 syslog 形式のタイムスタンプを変換する ...................................................................... 57
S18 	 メール形式の日付を変換する ............................................................................................. 58
S19 	 バージョン文字列をオブジェクトにする ...................................................................... 60
S20 	 IPv4 アドレスか確認する .................................................................................................... 63
S21 	 MAC アドレスか確認する .................................................................................................... 66
S22 	 HTTP ヘッダをオブジェクトに変換する ....................................................................... 68
S23 	 文字列に色を付ける ............................................................................................................... 71
S24 	 JQ_COLORS 環境変数を分解する ..................................................................................... 73
S25 	 全角 ASCII 文字を半角に直す ............................................................................................. 76

第3章

配列関数 ............................................................79

A01 	 配列要素を 2 乗する .............................................................................................................. 79
A02 	 配列の要素同士を加算する ................................................................................................. 81
A03 	 ドット積を求める ................................................................................................................... 83
A04 	 クロス積を求める ................................................................................................................... 85
A05 	 距離を求める . ........................................................................................................................... 86
A06 	 配列の組み合わせを取る ...................................................................................................... 87

xii

目 次

A07 	 アルファベットの配列を生成する .................................................................................... 89
A08 	 配列に配列を挿入する .......................................................................................................... 91
A09 	 長い配列を分割する ............................................................................................................... 91
A10 	 ステップ幅のあるスライス ................................................................................................. 93
A11 	 特定の要素の個数をカウントする .................................................................................... 94
A12 	 ネストされた配列に含まれた文字列の最大長を求める ........................................... 95
A13 	 文字列配列を大文字小文字関係なくソートする ........................................................ 97
A14 	 配列の配列を表形式にする ................................................................................................. 98
A15 	 テキストファイルを配列の配列にする . ...................................................................... 100
A16 	 CSV ファイルを配列の配列にする ................................................................................ 103
A17 	 配列をオブジェクトにする .............................................................................................. 104
A18 	 2 つの配列をオブジェクトにする ................................................................................. 106
A19 	 配列から検索結果の前後の要素を抜き出す .............................................................. 108

第4章

集合関数 .......................................................... 111

M01 	 集合を作成する ..................................................................................................................... 113
M02 	 集合に要素を追加する ....................................................................................................... 114
M03 	 集合から要素を取り除く ................................................................................................... 115
M04 	 和集合を求める ..................................................................................................................... 116
M05 	 積集合を求める ..................................................................................................................... 117
M06 	 差集合を求める ..................................................................................................................... 119
M07 	 対称差集合を求める ............................................................................................................ 120
M08 	 部分集合かを判定する ....................................................................................................... 121
M09 	 上位集合かを判定する ....................................................................................................... 122
M10 	 互いに素かを判定する ....................................................................................................... 123

第5章

統計関数 ..........................................................125

E01 	 総和を求める . ........................................................................................................................ 126
E02 	 平均値を求める ..................................................................................................................... 127
E03 	 中央値を求める ..................................................................................................................... 127

xiii

E04 	 最頻値を求める ..................................................................................................................... 129
E05 	 母分散を計算する ................................................................................................................ 131
E06 	 母標準偏差を計算する ....................................................................................................... 132
E07 	 標本不偏分散を計算する ................................................................................................... 133
E08 	 標本標準偏差を計算する ................................................................................................... 134

第6章

オブジェクト関数 .............................................137

O01 	 プロパティ名だけを再帰的に抜き出す . ...................................................................... 137
O02 	 オブジェクトをプロパティ名と一緒に抽出する ..................................................... 139
O03 	 プロパティの名前と値を入れ替える ............................................................................ 141
O04 	 プロパティ値をキーとしたオブジェクトを生成する ............................................ 143
O05 	 プロパティ名をオブジェクトに繰り込み、配列化する ........................................ 146
O06 	 指定のプロパティのないオブジェクトを抽出する ................................................. 148
O07 	 指定のプロパティのないオブジェクトを補完する ................................................. 149
O08 	 欠けているプロパティを見つける ................................................................................. 150
O09 	 プロパティ名の長さでソートする ................................................................................. 152
O10 	 入れ子オブジェクトの内側のプロパティ値でソートする ................................... 154
O11 	 指定のプロパティ値だけを定数倍する . ...................................................................... 157
O12 	 オブジェクトを CSV 化する ............................................................................................. 158
O13 	 CSV ファイルをオブジェクトに変換する ................................................................... 160

第7章

SQL 関数 ........................................................165

Q01 	 SELECT * FROM table; ....................................................................................................... 169
Q02 	 SELECT * FROM table ORDER BY column; ................................................................ 169
Q03 	 SELECT * FROM table ORDER BY column DESC; .................................................... 170
Q04 	 SELECT columns FROM table; ........................................................................................ 171
Q05 	 SELECT column * num FROM table; ............................................................................ 173
Q06 	 SELECT * FROM table WHERE column = value; ...................................................... 174
Q07 	 SELECT * FROM table WHERE column IN (values); .............................................. 175
Q08 	 SELECT * FROM table WHERE column BETWEEN num1 AND num2; .......... 176

xiv

目 次

Q09 	 SELECT COUNT(*) FROM table; ..................................................................................... 177
Q10 	 SELECT * FROM table1 UNION ALL SELECT * FROM table2; ........................... 178
Q11 	 SELECT * FROM table1 INTERSECT SELECT * FROM table2; ........................... 179
Q12 	 SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column; 	 ............................................................................................................................................ 180

Q13 	 DESC table; ............................................................................................................................. 183
Q14 	 INSERT INTO table VALUES(values); ........................................................................... 184
Q15 	 UPDATE table SET column1 = value1 WHERE column2 = value2; ................. 186
Q16 	 DELETE FROM table WHERE column = value; ........................................................ 187
Q17 	 ALTER TABLE table DROP COLUMN column; .......................................................... 188
Q18 	 ALTER TABLE table ADD COLUMN column DEFAULT value; ............................ 189
Q19 	 DROP table; ............................................................................................................................ 190

第8章

アルゴリズム関数 .............................................191

F01 	 九九の表 ................................................................................................................................... 192
F02 	 階乗（ループ版）................................................................................................................... 195
F03 	 階乗（再帰版）....................................................................................................................... 196
F04 	 フィボナッチ数列（ループ版）....................................................................................... 198
F05 	 フィボナッチ数列（再帰版）............................................................................................ 200
F06 	 素数 ............................................................................................................................................ 201
F07 	 π ................................................................................................................................................ 203
F08 	 e . ................................................................................................................................................. 205

第9章

その他関数 .......................................................207

T01 	 JSON ではない入力を無視する ....................................................................................... 207
T02 	 指定の行番号のみ処理する .............................................................................................. 209
T03 	 環境変数でプロパティ名を指定する ............................................................................ 211
T04 	 オブジェクトを環境変数にする ..................................................................................... 213
T05 	 コマンド引数からプロパティ名を指定する .............................................................. 214
T06 	 ファイルに記述したパスから抽出する . ...................................................................... 215

xv

付録 .............................................................................221
付録 A 	 関数定義 ................................................................................................................................... 221
付録 B 	 ビルトイン関数の用法 ....................................................................................................... 233
付録 C 	 用語 ............................................................................................................................................ 248
付録 D 	 特殊記号 ................................................................................................................................... 264
付録 E 	 関数リスト .............................................................................................................................. 266
索 引 .......................................................................................................................................................... 272

xvi

第1章
数値関数

第1章

数値関数

本章では、数値を入力として受ける関数のレシピを紹介します。

本章の関数はファイル number.jq にまとめてあります。実行例では次のように呼び出します。
$ jq -n 'include "number"; m_pi'

3.141592653589793

N01# πを出力する関数m_pi

πを得る

目的
高精度なπ（円周率）がほしい（たいていの言語にはこの定数があります）。
関数
def m_pi:

3.141592653589793;# 1 | atan * 4;

1

1

数値関数

用例
次の例では、πの値を出力しています。
$ jq -n 'include "number"; m_pi'
3.141592653589793

次の例では、60 度の sin 値を求めています。ビルトイン関数 sin はラジアンしか受け付けません。

$ jq -n 'include "number"; 60 * m_pi / 180 | sin'
0.8660254037844386

説明
直値だけのフィルタは、入力をすべて無視してその値を出力します。

借用元の C 言語の M_PI（math.h ヘッダ）より桁数が短いのは、それが jq の倍精度浮動小数点数の精度範囲だからです。ヘッダから直接コピーしたものと、jq による処理後を比較します。jq
は精度範囲外の数値が入力されると自動的にその範囲内に丸めます。
#

Cの定数。下5桁分長い$ echo 3.14159265358979323846 | tee /dev/tty | jq '.'3.14159265358979323846

3.141592653589793# もとのM_PI# jqの精度範囲

直値が美しくないと思うのなら、コメントアウトしている行を代わりに使用します。tan−1(1) は
π /4 を返します。あるいは［レシピ F07］を参照してください。

sin などラジアンを使用する三角関数を角度（°）から使えるようにするのが主たる用途です。

後述の［レシピ N03］や［レシピ N05］内からも呼び出しています。

N02 e を得る
目的
高精度な e（ネイピア数）がほしい（たいていの言語にはこの定数がある）。

2

N03 ラジアンを角度に変換する

関数1

def m_e:2.718281828459045;

2# 1 | exp;3
用例
次の例では、ネイピア数の値を出力しています。

4$ jq -n 'include "number"; m_e'

52.718281828459045

6

次の例では、e の 2 乗をビルトイン関数の pow から計算しています。

7$ jq -n 'include "number"; pow(m_e; 2)'7.3890560989306495

8

説明

9

しましたが、［レシピ N01］のπ同様、jq の浮動小数点数の精度範囲内で丸めています。

10

あらかじめ用意した定数を返すだけの関数です。値は C 言語の M_E（math.h ヘッダ）から借用

直値が嫌いなら、コメントアウトしている行を代わりに使用します。exp から e1 を計算すれば得られます。

イ チ か ら 計 算 し た い 好 事 家 に は、 級 数 か ら e を 算 出 す る 関 数 を［ レ シ ピ F08］ で 紹 介 し
ます。

N03

ラジアンを角度に変換する

目的

ラジアンを角度に変換したい（Python の math.degrees と類似の機能）。

関数
def to_degree:

付 録. * 180 / m_pi;

3

1

数値関数

用例

次の例では、三角形の底辺と高さの比を配列で示した [2, 1] から、その三角形の角度を求めています。ビルトイン関数 atan の出力はラジアンなので、この関数から角度に変換します。
$ echo '[2, 1]' | jq 'include "number"; .[1] / .[0] | atan | to_degree'
26.56505117707799

説明

入力値 . に 180 を掛けてπで割るだけです。πは［レシピ N01］で作成した m_pi 関数を利用しています。同じ number.jq に属する関数なので、そのまま呼び出せます。

N04

角度をラジアンに変換する

目的

角度をラジアンに変換したい（Python の math.radians と類似の機能）。

関数
def to_radian:. * m_pi / 180;

用例
次の例では、角度単位で sin(30) を計算しています。
$ echo 30 | jq 'include "number"; to_radian | sin'0.49999999999999994

説明

ここでも［レシピ N01］の m_pi 関数を利用しています。中身は［レシピ N04］の逆です。

4

N06 整数のビット長を返す

N05

絶対値を計算する

1
2

目的
絶対値を計算したい。

3関数
def abs:

4

fabs;

5

用例

次の例では、-2.3 の絶対値を求めています。

6$ jq -n 'include "number"; -2.3 | abs'

7

2.3

8

説明

ビルトイン関数の fabs（floating point abs）がすでにありますが、C の関数に慣れていないと、

9

関数定義そのものにおもしろみはありませんが、これは、関数が定義したブロックを関数名と単10しばしば f を付け忘れます。そこで、異なる名前で再定義します。

純に置き換えるだけのマクロでしかないことを示しています。用例の -2.3 | abs は、置き換えられて -2.3 | fabs になります。この構造は、関数ブロックがどんなに長く複雑になっても変わりま
せん。

N06

整数のビット長を返す

目的

整数のビット長を知りたい（Python の int.bit_length と類似の機能）。

関数
def bit_length:

付 録

if . == 0 then
0

else

5

1

数値関数

fabs |

log2 | floor + 1

end;

用例
次の例では、23510（2 進数にして 1110 10112）のビット長を計算しています。
$ jq -n 'include "number"; 235 | bit_length'8

関数は負の値も正として扱うので、−235 にしても結果は同じです。
$ jq -n 'include "number"; -235 | bit_length'8

次の例では、0 から 15 までの数値をそれぞれのビット長を配列で出力します。連続した数値の生成には range を使います（付録 B.1）。配列要素を順次処理した結果を再び配列として返すには、
map です（付録 B.4）。

$ jq -cn 'include "number"; [ range(0; 16) ] | map(bit_length)'[0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4]

説明

整数 N のビット長は log2(N) から計算できます。ビルトイン関数は log2 です。

ただし、log2 は N = 0 のとき、エラーこそ報告しませんが負の無限大を出力します。値が無限大かは isinfinite から確認できます。
$ jq -n '0 | log2'# log2(0)$ jq -n '0 | log2 | isinfinite'# log2(0)は無限-1.7976931348623157e+308
true

数値 0 のビット数は 0 と定義されているので、N = 0 だけは if-then-else-end で例外処理をします（付録 B.2）。

6

N07 10 進数を N 進数に変換する

fabs が用いられていることからわかるように、負の値は正として計算しています。

1

log2 の結果は浮動小数点数になるので、切り捨ての floor から整数に直します。切り上げのceil を使わず、切り捨ててから 1 を加えているのは、2 の N 乗には N+1 ビットが必要だからで2す（たとえば、22 = 410 = 1002 なので、3 ビットです）。次の例では 2 の 1 乗から 5 乗までの値のlog2+1 を計算しています。

3$ jq -cn '[2, 4, 8, 16, 32] | map(log2 + 1)'

4[2,3,4,5,6]

5

N07 10 進数を N 進数に変換する

6

目的

7

10 進数を任意の N 進数に変換したい。

8関数
def base_n_array($base):

9[., . % $base] |10fabs | floor |[while (.[0] != 0;] |)[.[0] / $base | floor, . % $base]map(.[1]) |reverse;

用例
次の例では、10 進数で 758510 を 7 進数に変換します。
$ echo 7585 | jq -c 'include "number"; base_n_array(7)'[3,1,0,5,4]

付 録

出力は配列です。あとから 2 進数化や 16 進数化でこの関数を用いるので、（関数からの）使い

7

1

数値関数

勝手を考慮して数値配列のまま出力するように設計しています。文字列が必要なら、tostring とjoin を通します（ただし N ≦ 10 のときのみ）。

$ echo 7585 | jq -r 'include "number"; base_n_array(7) | map(tostring) | join("")'
31054

説明
10 進数を N 進数に変換するには、商が 0 になるまで N で順次割っていき、その剰余を並べます（高校数学で出てくる方法です）。次の図は 758510 を 7 進数にするために順次 7 で割っていき、その余りの 45013 をひっくり返し、310547 を得る様子を示しています。

7 7585

... 4

7

... 0

7 1083
7

154

22
3

... 5
... 1

31054(7)関数は数値を入力として受け、パラメータ引数に指定した値（$base）を底としてこの計算をします。

最初に、fabs と floor で正の整数化することで、入力をクリーンにしています（文字列や配列が入力されたときは、手当てをしていないのでエラーが上がります）。

図の割り算には、割られる数（前の商）と剰余の 2 つの値を収容するコンテナが必要です。こ
こではこれを配列で表現しています。初期状態では第 0 要素が入力値（割られる数）、第 1 要素が$base で割ったときの剰余です。上図では [7585, 4] です。

あとは割り算を続けていくわけですが、これには while でループを組みます（付録 B.3）。第 1

引数にはループを続行する条件式を記述します。割られる数 .[0] が 0 以外ならループ続行なので、ここは .[0] != 0 です。第 2 引数では配列を更新します。ここでポイントは、まず割られる

数を先に割り（.[0] / $base |）、この出力の整数値（. | floor、すなわち floor）を第 0 要素に、その値の剰余（. % $base）を第 1 要素にしているところです。

while はこの [ 割られる数 , 剰余 ] 配列（.）を毎回出力します。while の出力は、全体を [] で8

N08 10 進数を 2 進数に変換する

くくることで配列化します（付録 B.8）。つまり、[ while ... ] が生成するのは配列の配列です。

1

コードの最後の 2 行を除けば、ループ時の状況を確認できます。次は、図と同じ 7585 と底 7 を指定したときの出力です。
[

2
3[7585, 4],[1083, 5],[154, 0],4

[3, 3]

5[22, 1],]6

図と同じパターンが得られました。

あとはこの配列の配列から、内側の配列の第 1 要素（.[1]）を抜き出すだけです。これには、

7

配列の全要素を順に操作して置き換える map を使います（付録 B.4）。（フィルタ版の）高階関数なので、引数にはどんなフィルタでも書き込めます。

8

配列の並びは図の上からなので、下から読むために reverse で反転します。

9

N08 10 進数を 2 進数に変換する

10

目的

10 進数を文字列表記の 2 進数に変換したい（Python の bin と類似の機能）。なお、JSON には数値を 2 進数のまま表記する方法がないので、Python 風に先頭に 0b を加えた文字列として出力します。
関数
def bin:base_n_array(2) |map(tostring) |"0b" + join("");

用例
付 録

実行例を示します。先ほど同様、入力値は 7585 とします。

9

1

数値関数

$ echo 7585 | jq -r 'include "number"; bin'0b1110110100001

説明［レシピ N07］の汎用 N 進数関数を早速用いています。あとは、得られた配列の要素を数値から文字列に変換し、join で連結します。このとき、先頭に 0b も加えます。

N09 10 進数を 16 進数に変換する
目的

10 進数を文字列表記の 16 進数に変換したい（Python の hex と類似の機能）。16 進数もやはり

表記は文字列にし、先頭に 0x を加えます。
関数
def hex:["0", "1", "2", "3", "4", "5", "6", "7","8", "9", "A", "B", "C", "D", "E", "F"] as $hexadecimal |base_n_array(16) |map($hexadecimal[.]) |"0x" + join("");

用例
実行例を示します。先ほど同様、入力値は 7585 とします。
$ echo 7585 | jq -r 'include "number"; hex'
0x1DA1

説明
16 進数はアルファベットの A から F を使うので、たとえば 10 = "A" などの対応付けが必要です。これを定義しているのが最初の行の $hexadecimal 変数です（付録 B.5）。配列なので、$hexadecimal[n] の要領で 10 進数 n を指定すれば、その 16 進数文字列が得られます。

ASCII コードから計算しないのはプログラマの名折れだと思う方は、次のレシピを参照してください。比べるとわかりますが、たかだか 16 文字なので、こちらの方が絶対楽で高速です。

10