0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

jqの長いフィルターを改行したい

Last updated at Posted at 2025-01-18

目次

やりたいことの概要

フィルター処理が多いjqコマンドを書いていると、思いがけず横に長くなってしまいがちなので、可読性向上のために改行したくなるものです。

安易にバッククォートで改行できるかなぁと思って試行錯誤していたら、結構手間取ったのでメモとして残しておきます。

どうやるか

例えば、以下のようなデータがあるとします。

test_data.json
[
    {"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初記事です!
この記事とそんなことは全く関係ないのですが、めでたさのあまり最後に書いてしまいました。

この記事がどなたかの役に立てたら幸いです!

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?