【问题标题】:Delete a JSON object when a value inside the object matches a designated value (jq)当对象内的值与指定值匹配时删除 JSON 对象 (jq)
【发布时间】:2021-07-01 18:00:34
【问题描述】:

目标是删除 JSON 文件中包含 JQ 脚本中指定的键/值对的整个对象。

例如,path 中所有带有/unwanted-path/ 的对象都将被删除:

input.json:

[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/path-2/",
        "guide": "Guide 2"
    },
    {
        "path": "/unwanted-path/",
        "guide": "Guide 3"
    }
]

输出.json:

[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/path-2/",
        "guide": "Guide 2"
    }
]

就潜在的成功方法而言,这个 JQ 脚本是我最接近的,但它的意图当然不同,并没有实现目标。

jq '.[] | walk(if type == "object" then del(.path) else . end)' original.json > modified.json

有没有办法在其中添加逻辑来指定与path 一起使用的键?

密钥始终是path,但我将过滤几个path 值。如果有一种方法可以一次过滤多个 path 值,那是理想的,但并不重要。

【问题讨论】:

  • 您是否也希望在嵌套范围内拥有path?还是只在顶级数组内?
  • @Inian 你的问题对我来说是高级的,但如果我理解正确它不会被嵌套。

标签: json jq delete-operator


【解决方案1】:

以下代码通过四个示例展示了如何解决您的任务

#!/bin/bash

FILE='
[
    {
        "path": "/path-1/",
        "guide": "Guide 1"
    },
    {
        "path": "/unwanted-path-2/",
        "guide": "Guide 2"
    },
    {
        "path": "/path-3/",
        "guide": "Guide 3",
        "sub": [
            {
                "path": "/unwanted-path-4/",
                "guide": "Guide 4"
            },
            {
                "path": "/path-5/",
                "guide": "Guide 5"
            },
            [
                {
                    "path": "/path-6/",
                    "guide": "Guide 6"
                },
                {
                    "path": "/unwanted-path-7/",
                    "guide": "Guide 7"
                }
            ]
        ]
    }
]
'

UNWANTED='/unwanted-path-2/'
echo "example 1: keep only objects in array that does not have the unwanted path '$UNWANTED' (narrow search)"
jq --arg unwantedPath "$UNWANTED" \
   'map(select(.path != $unwantedPath))' <<< "$FILE"

UNWANTED='/unwanted-path-7/'
echo -e "\nexample 2: delete objects that have the unwanted path '$UNWANTED' exactly (deep search)"
jq --arg unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path == $unwantedPath)) ' <<< "$FILE"

UNWANTED='unwanted'
echo -e "\nexample 3: delete objects that have the unwanted path '$UNWANTED' partially (deep search)"
jq --arg unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path | index($unwantedPath) != null)) ' <<< "$FILE"

UNWANTED='["/unwanted-path-4/", "/unwanted-path-7/"]'
echo -e "\nexample 4: delete objects that have one of unwanted paths '$UNWANTED' (deep search)"
jq --argjson unwantedPath "$UNWANTED" \
   'del(..| objects | select(.path | IN($unwantedPath[]))) ' <<< "$FILE"

输出示例 1:仅保留数组中没有不需要的路径 '/unwanted-path-2/' 的对象(窄搜索)

[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/unwanted-path-4/",
        "guide": "Guide 4"
      },
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        },
        {
          "path": "/unwanted-path-7/",
          "guide": "Guide 7"
        }
      ]
    ]
  }
]

输出示例 2:完全删除具有不需要的路径 '/unwanted-path-7/' 的对象(深度搜索)

[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/unwanted-path-2/",
    "guide": "Guide 2"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/unwanted-path-4/",
        "guide": "Guide 4"
      },
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]

输出示例 3:部分删除具有不需要的路径“不需要”的对象(深度搜索)

[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]

输出示例 4:删除具有不需要的路径 '["/unwanted-path-4/"、"/unwanted-path-7/"]' 之一的对象(深度搜索)

[
  {
    "path": "/path-1/",
    "guide": "Guide 1"
  },
  {
    "path": "/unwanted-path-2/",
    "guide": "Guide 2"
  },
  {
    "path": "/path-3/",
    "guide": "Guide 3",
    "sub": [
      {
        "path": "/path-5/",
        "guide": "Guide 5"
      },
      [
        {
          "path": "/path-6/",
          "guide": "Guide 6"
        }
      ]
    ]
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多