web-dev-qa-db-ja.com

jqでキーとそれらのキーの値でjsonファイルをソートする方法

Pentaho CToolsライブラリを使用してWebサイトを構築しています。PentahoCToolsライブラリには、ダッシュボードの一部のJSON形式ファイルを書き込むグラフィカルダッシュボードエディタがあります。

キーで、次に特定のキーの値でソートするために、gitにチェックインする前にこれらのファイルに変換を適用したいと思います。エディターにはすべてのjsonフィールドを再配置する習慣があるため、目的は差分を簡単にすることです。

たとえば、次のようなものがあります。

{
  "components": {
    "rows": [
      {
        "id": "CHARTS",
        "name": "Charts",
        "parent": "UnIqEiD",
        "properties": [
          {
            "name": "Group",
            "type": "Label",
            "value": "Charts"
          }
        ],
        "type": "Label",
        "typeDesc": "<i>Group</i>"
      },
      {
        "id": "kjalajsdjf",
        "meta_cdwSupport": "true",
        "parent": "CHARTS",
        "properties": [
          {
            "name": "name",
            "type": "Id",
            "value": "Value1"
          },
          {
            "name": "title",
            "type": "String",
            "value": "Value2"
          },
          {
            "name": "listeners",
            "type": "Listeners",
            "value": "[]"
          },
...

jq --sort-keyshttp://stedolan.github.io/jq/ )すべてのキーをソートしますが、sort_by関数は、特定のキーの値で特定の特定の要素をソートします(したがって、上記の例では、properties.name 例えば。何か案は?

32
karlos

OK IRCチャンネルで助けを借りて、答えを見つけました。

基本的には次のようになります。

> jq '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' file.json > out.json

したがって、適切なオブジェクトを選択し、必要に応じて配列を調べてから、sort_byが単一の値を取るだけです(失敗したsort_by(.components.rows.id)を試していました)。

|の代わりに| =値を取り除く代わりに値を渡します。

48
karlos