jqでpretty-printしたJSONの一部をコンパクトに出力する

以下のような長めの配列を含むJSONがほしい場合、

1
2
3
4
{
  "odd": [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31],
  "even": [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
}

jqでpretty-printすると配列が要素ごとに改行されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ echo '{"odd":[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31],"even":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]}' | jq
{
  "odd": [
    1,
    3,
    5,
    7,
    9,
    11,
    13,
    15,
    17,
    19,
    21,
    23,
    25,
    27,
    29,
    31
  ],
  "even": [
    0,
    2,
    4,
    6,
    8,
    10,
    12,
    14,
    16,
    18,
    20,
    22,
    24,
    26,
    28,
    30
  ]
}

このような出力だと大きなJSONファイルのときは行数が膨大になって扱いにくいと思います。 私が最近作ったCamelliaZig実装のcamellia-zigではテストベクターにJSONファイルを使っていますが、配列が要素ごとに改行された結果、5万行近いJSONファイルになって困っていました。 コンパクト出力を使えば行数は減らせますが、全体がコンパクト出力になるのは望んでいませんでした。 上記の問題を解決したかったので、最初の例のように配列を要素ごとに改行しないで出力する方法を調べました。

方法

jqlang/jq#643のコメントddopson/underscore-cliを使う方法で最初の例のように出力できました。

1
2
3
4
5
$ echo '{"odd":[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31],"even":[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30]}' | jq | npx underscore pretty --outfmt json
{
  "odd": [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31],
  "even": [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
}

この方法でテストベクターファイルの行数を5,000行程度まで減らすことができました。

終わりに

もっと良い方法があったら教えてもらえると嬉しいです。

この記事はCC BY 4.0の下でライセンスされています
最終更新 2024年12月24日 18:48 +0900
Hugo で構築されています。
テーマ StackJimmy によって設計されています。