jqで各最初のレベルのjsonフィールドを独自の行に印刷する方法は?

jqで各最初のレベルのjsonフィールドを独自の行に印刷する方法は?

次のコマンドを使用してjsonファイルをきれいに印刷するとき

cat xx.json | jq .

、各フィールドを1行に印刷します。たとえば、jsonファイルにxy座標配列が含まれている場合、出力は非常に長くなります。

jqjsonオブジェクト(つまり、ルートの直系サブフィールド)の各最初のレベルフィールドを独自の行に印刷する方法はありますか?

kより一般的には、レベルkの各子がその子(kより大きいレベル)を含む行に印刷されるようにjsonオブジェクトをレベルに拡張する方法はありますか?

- 説明:

小さな例は次のとおりです。

echo '{"type":"MultiPolygon","coordinates":[[[[-94.9065,38.9884],[-94.8682,39.0596],[-94.6053,39.0432],[-94.6108,38.8460],[-94.6108,38.7365],[-94.9668,38.7365],[-95.0544,38.7365],[-95.0544,38.9829]]]]}"' | jq .

生成する:

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [
          -94.9065,
          38.9884
        ],
        [
          -94.8682,
          39.0596
        ],
        [
          -94.6053,
          39.0432
        ],
        [
          -94.6108,
          38.846
        ],
        [
          -94.6108,
          38.7365
        ],
        [
          -94.9668,
          38.7365
        ],
        [
          -95.0544,
          38.7365
        ],
        [
          -95.0544,
          38.9829
        ]
      ]
    ]
  ]
}

"coordinates"1行のすべての値と各兄弟の値を印刷したいです(もっと一般的には、フィールドがルートのcoordinates最初のレベルではなくk番目のレベルにある場合は同じ効果を得たい)。

ベストアンサー1

ユーティリティjqはきれいな印刷に対してこのレベルの制御を提供しません。おそらく利用可能な最も簡単なアプローチは、直列化されたjq構造部分を出力することです。

$ jq '.coordinates[][] |= map(@json)' file
{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        "[-94.9065,38.9884]",
        "[-94.8682,39.0596]",
        "[-94.6053,39.0432]",
        "[-94.6108,38.846]",
        "[-94.6108,38.7365]",
        "[-94.9668,38.7365]",
        "[-95.0544,38.7365]",
        "[-95.0544,38.9829]"
      ]
    ]
  ]
}

これにより、配列内の配列は、直列化され.coordinates[][]た配列を表すJSONエンコード文字列に置き換えられます。直列化された配列がfromjson最初に渡されない場合、これは処理には使用されませんjq。しかし、出力が可視化のためだけのものであれば、この方法で十分です。

より高いレベルの直列化を適用します。

$ jq '.coordinates[] |= map(@json)' file
{
  "type": "MultiPolygon",
  "coordinates": [
    [
      "[[-94.9065,38.9884],[-94.8682,39.0596],[-94.6053,39.0432],[-94.6108,38.846],[-94.6108,38.7365],[-94.9668,38.7365],[-95.0544,38.7365],[-95.0544,38.9829]]"
    ]
  ]
}

というツールがあります。jtcjqは、JSONドキュメントの一般的なきれいな印刷および圧縮出力形式からインスピレーションを得て提供しています。また、最も内側のオブジェクトを簡潔な方法で表示する「半分化」形式もあります。

$ jtc -tc file
{
   "coordinates": [
      [
         [
            [ -94.9065, 38.9884 ],
            [ -94.8682, 39.0596 ],
            [ -94.6053, 39.0432 ],
            [ -94.6108, 38.846 ],
            [ -94.6108, 38.7365 ],
            [ -94.9668, 38.7365 ],
            [ -95.0544, 38.7365 ],
            [ -95.0544, 38.9829 ]
         ]
      ]
   ],
   "type": "MultiPolygon"
}

私はこれについてよく理解していないので、jtcこの出力形式が設定可能かどうかはすぐには言えません。ユーザーマニュアルイムを見せるいいえ必要に応じて正確に設定してください。)また、これはキーjtcでオブジェクトをソートすることに注意してください。


あなたも正しいかもしれません。 。 。興味があるjless目標が端末でデータを手動で閲覧または表示することです。デフォルトでは、次のデータが表示されます。

▼ {type: "MultiPolygon", coordinates: […]}
    type: "MultiPolygon"
  ▽ coordinates: [[[[…], […], […], […], […], […], […], […]]]]
    ▽ [0]: [[[…], […], […], […], […], […], […], […]]]
      ▽ [0]: [[…], […], […], […], […], […], […], […]]
        ▽ [0]: [-94.9065, 38.9884]
            [0]: -94.9065
            [1]: 38.9884
        ▽ [1]: [-94.8682, 39.0596]
            [0]: -94.8682
            [1]: 39.0596
        ▽ [2]: [-94.6053, 39.0432]
            [0]: -94.6053
            [1]: 39.0432
        ▽ [3]: [-94.6108, 38.846]
            [0]: -94.6108
            [1]: 38.846
        ▽ [4]: [-94.6108, 38.7365]
            [0]: -94.6108
            [1]: 38.7365
        ▽ [5]: [-94.9668, 38.7365]
            [0]: -94.9668
            [1]: 38.7365
        ▽ [6]: [-95.0544, 38.7365]
            [0]: -95.0544
            [1]: 38.7365
        ▽ [7]: [-95.0544, 38.9829]
            [0]: -95.0544
            [1]: 38.9829

...各セクションは矢印キーを使用して簡単に折りたたみできます。

おすすめ記事