目次
やりたいことの概要
フィルター処理が多いjqコマンドを書いていると、思いがけず横に長くなってしまいがちなので、可読性向上のために改行したくなるものです。
安易にバッククォートで改行できるかなぁと思って試行錯誤していたら、結構手間取ったのでメモとして残しておきます。
どうやるか
例えば、以下のようなデータがあるとします。
[
{"id": "1", "name": "Yamada Taro", "age": 16, "score": 90},
{"id": "2", "name": "Suzuki Hanako", "age": 17, "score": 85},
{"id": "3", "name": "Tanaka Ichiro", "age": 15, "score": 88},
{"id": "4", "name": "Sato Emiko", "age": 16, "score": 92}
]
このデータから、各要素のキー: id
, name
, score
だけを抽出し、新たなキーを付与して別の配列として再構成するものとします。
これは以下のようなコマンドで実現できます。
cat test_data.json | jq '[.[] | {student_id: .id, student_name: .name, student_score: .score}]'
もしかするとこれくらいなら許容できるかもしれませんが、JSONが1行に記載されており、一見では最終的にどのようなJSONが出力されるのかがイメージしづらいです。
jqで新しいJSONを定義する部分は、key-value がパッと見でわかったほうが良さそうです。
そこで、jqコマンドのクエリ部分を改行しようと思い、まずは次のような安直に改行したコマンドを考えましたが、エラーになってしまいました。
jq '{\
student_id: .id, \
student_name: .name,\
student_score: .score\
}'
どうやら、シングルクォート内のバックスラッシュによる改行はエラーとなってしまうようです。(もしかしたら常識?)
結局どうしたらいいか
結論としては、「シングルクォートで一度jqのクエリのクォートを抜けて、バックスラッシュで改行できる」ことがわかりました。
なので、前述したコマンドは以下のようにすれば改行を含んだままコマンドが通ります。
jq '{'\
' student_id: .id, '\
' student_name: .name,'\
' student_score: .score'\
'}'
イメージとしては、シングルクォートを一度挟むことで、jqのクエリ文字列を一旦解除している感じでしょうか。
そういえば、jqのクエリの中でシェルの変数を展開するときも、一旦シングルクォートでjqを解除するような記述をする必要がありました。
参考: https://qiita.com/takehilo/items/79a89a943f1ae1e6be0b#フィルタの一部を変数化
ややデメリット
このjq改行メソッド(いま名付けた)には、少しばかりデメリットがありそうです。
最初は何やってるかわかりにくいように見える
個人的にはあまり見慣れない記法だったので、最初は少し抵抗のある記述でした。
複数人で開発を行っている場合などには、もしかしたら最初の私と同じように抵抗感があるメンバーもいるかも知れません。
jqクエリのJSONはVSCodeにはJSONとして認識されない(折りたたみが使えない)
当たり前っちゃ当たり前なんですが、シングルクォートで囲まれてるので、jqクエリ内にあるJSONは改行したとてVSCodeにはJSONとして認識されませんでした。
VSCodeでコードやJSONなどのファイルを扱う際、ソースのグループに応じてリソースを折りたたんだり開いたりできますが、それができません。
おわりに
実はこの記事が私のQiita初記事です!
この記事とそんなことは全く関係ないのですが、めでたさのあまり最後に書いてしまいました。
この記事がどなたかの役に立てたら幸いです!