jqフィルタ:選択して全体構造を表示

jqフィルタ:選択して全体構造を表示

次のfile1 jsonがあります。

{
  "name": "eye",
  "attributes": [
    {
      "name": "Width",
      "value": "1920"
    },
    {
      "name": "Height",
      "value": "1080"
    },
    {
      "name": "WinKeyMapping",
      "value": "leftwin"
    }
  ],
  "starts": [
    {
      "name": "step1",
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        },
        {
          "name": "Test",
          "value": "none"
        }
      ]
    }
  ]
}

そして次のフィルタ:

$ jq '.starts[].attributeList[]|select(.name=="Command")' file1
{
  "name": "Command",
  "value": "bash"
}
$

この選択肢の全体構造をどのように取得できますか?

予想出力:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

答え1

直接jq:

jq '{ starts: [ { attributeList: (.starts[].attributeList 
                                  | map(select(.name == "Command"))) }] }' file.json

出力:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

答え2

以下は、目的の出力を取得する2つのオプションです。

不要なキーを削除できます。

jq 'del(.attributes, .name) | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

あるいは、希望のキーを選択することもできます。

jq 'to_entries | map(select(.key == "starts")) | from_entries | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

どちらも同じ結果を提供します。必要に応じて、starts後者endsの場合は追加のorステートメントを追加できますmap(select((.key == "starts") or (.key == "ends")))

答え3

より一般的なアプローチは次のとおりですjq

def pick_out(q): path(q) as $path | ($path | length) as $length |
    delpaths(
        [
            paths(..) |
            select(length <= $length and $path[0:length] != . )
        ]
    );

これはjq、指定された引数(呼び出し可能)のパスのどこにもない文書へのすべてのパスを削除する関数ですselect()

保存すると、pick_out.jq次のように使用できます。

jq 'include "pick_out";
    pick_out(
        .starts[].attributeList[] | select(.name == "Command")
    )' file.json

出力:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

関連情報