Ich habe die folgende Eingabedatei:

{
    "dic": {
        "a": "",
        "b": "",
        "c": "",
        "d": ""
    },
    "remove": {
        "b": true,
        "c": false,
        "d": true
    }
}

Ich möchte mit jq alle Elemente des Wörterbuchs dic entfernen, die sich ebenfalls im Wörterbuch remove mit dem Wert true befinden.

Dies wäre die Ausgabe:

{
    "dic": {
        "a": "",
        "c": ""
    },
    "remove": {
        "b": true,
        "c": false,
        "d": true
    }
}

Ich bin mir nicht sicher, wie ich das machen soll. Ich müsste zuerst das remove dic bereinigen und nur die Schlüssel mit dem Wert true erhalten. Dann müsste ich irgendwie nur diese Schlüssel aus dic löschen.

5
Noim 18 Aug. 2020 im 18:54

3 Antworten

Beste Antwort

Sie brauchen dafür nichts anderes als JQ.

[.remove | path(.[] | select(.))] as $p | .dic |= delpaths($p)

Online-Demo

Wenn in remove möglicherweise andere Werte als true und false enthalten sind, verwenden Sie

select(. == true)

Anstatt von

select(.)
4
oguz ismail 7 Dez. 2020 im 10:11

Hier ist eine einfache und effiziente Lösung, die nur jq verwendet:

(.remove | with_entries(select(.value == true))) as $remove
| .dic |= with_entries(select($remove[.key] | not))
3
peak 19 Aug. 2020 im 01:39

Dies kann mit Bash-Loops erfolgen:

#!/bin/bash
# saving the json so we can manipulate it freely
data="$(cat data.json)"
for k in $(echo "$data" | jq '.remove' | jq -r keys[]) # getting all the keys from remove
do
    # skipping the key if it isn't supposed to be removed
    [ $(echo "$data" | jq .remove.$k) == 'false' ] && continue
    data="$(echo "$data" | jq "del(.dic.$k)")" # removing the key
done
echo "$data" # final json without the keys
0
Gustavo Kawamoto 18 Aug. 2020 im 16:10