jsonファイルの行位置の順序を変更する

jsonファイルの行位置の順序を変更する

私が望む行はdescriptionその行の後ろにあります。body

はい。

から:

{
    "foo": {
        "prefix": "foo",
        "description": "foo",
        "body": [
            "line 1",
            "  line 2"
        ]
    },
    "bar": {
        "prefix": "bar1",
        "description": "bar 1 bar",
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ]
    }
}

到着する:

{
    "foo": {
        "prefix": "foo",
        "body": [
            "line 1",
            "  line 2"
        ],
        "description": "foo"
    },
    "bar": {
        "prefix": "bar1",
        "body": [
            "line 1",
            "  line 2",
            "  line 3",
            "...."
        ],
        "description": "bar 1 bar"
    }
}

ベストアンサー1

私はあなたが持っている最初のJSON文書があなたが持っているものであり、2番目のJSON文書はあなたが得たいことを示していると仮定します。

使用jq:

jq '.[] |= ( to_entries | [.[0],.[2],.[1]] | from_entries )' file

最初のビットはto_entries2つのサブオブジェクトの合計fooにそれぞれ適用され、それbarを「アイテム」、つまりキーを持つ配列に変換します。たとえば、オブジェクトは次のようになります。keyvaluefoo

[
  {
    "key": "prefix",
    "value": "foo"
  },
  {
    "key": "description",
    "value": "foo"
  },
  {
    "key": "body",
    "value": [
      "line 1",
      "  line 2"
    ]
  }
]

ここでは、配列の3つの要素を0、1、2の順序から0、2、1の順に並べ替えるだけです。つまり、最後の要素を項目に置き換えるだけです。

これが私たちがすることです[.[0],.[2],.[1]]

それからfrom_entries

データリターンでこれをテストします。

{
  "foo": {
    "prefix": "foo",
    "body": [
      "line 1",
      "  line 2"
    ],
    "description": "foo"
  },
  "bar": {
    "prefix": "bar1",
    "body": [
      "line 1",
      "  line 2",
      "  line 3",
      "...."
    ],
    "description": "bar 1 bar"
  }
}

各子オブジェクトのキー命名に満足している場合(最後の2つのキーを置き換える代わりに)、次のコマンドは上記と同じ効果を持ちます。

jq '.[] |= { prefix: .prefix, body: .body, description: .description }' file

これは基本的に新しい2つの子オブジェクトfooのそれぞれのオブジェクトでbarあり、そのキーは指定された順序でソートされます。

おすすめ記事