2016-06-18 15 views
1

Das klingt wie eine grundlegende Frage, aber ich habe schon seit einiger Zeit nach einer besseren Lösung gesucht ...Mit jq, wie zwei Arrays mit verschiedenen Schlüsseln und Werten aus zwei JSON-Dateien subtrahiert werden?

Ich habe die folgenden Dateien:

file0.json:

{ 
    "d": { 
    "aaData": [ 
       {"a":1}, 
       {"a":2}, 
       {"a":3}, 
       {"a":4} 
      ] 
     } 
} 

und

file1.json:

[ 
    {"b":1}, 
    {"b":2}, 
    {"b":7} 
] 

und ich möchte eine Subtraktion zwischen dann mit dem erwarteten Ergebnis:

{ 
    "key": 3 
} 
{ 
    "key": 4 
} 

I des folgenden Befehls gedacht, die Arbeit erledigen:

bash$ jq -s '[.d.aaData[].a] - [.[].b] | { key: .}' file0.json file1.json

aber es gibt mir den Folgefehler:

Cannot index array with string "b"

Was Sinn macht, da [.[1].b] would't ein Array erstellen, aber so etwas wie [1][2][7]

die einzige Art, wie ich das erwartete Ergebnis bekommen verwaltet wurde die schmutzige Lösung in meiner Bash-Skript Codierung:

bash$ a=$(jq '[.d.aaData[].a] | {key1: .}' file0.json) 
bash$ b=$(jq '[.[].b] | {key2: . }' file1.json) 
bash$ c=$(echo -n $a,$b) 
bash$ echo $c 
{ "key1": [ 1, 2, 3, 4 ] },{ "key2": [ 1, 2, 7 ] } 
bash$ d=${c//"},{"/","} 
bash$ echo $d 
{ "key1": [ 1, 2, 3, 4 ] , "key2": [ 1, 2, 7 ] } 
bash$ echo -n $d | jq '.key1 - .key2 | { key: .[] }' 
{ 
    "key": 3 
} 
{ 
    "key": 4 
} 

Ich bin ziemlich sicher, es gibt einen besseren Weg, es mit jq zu tun .... kann einfach nicht finden, wie ...

Antwort

0

Wählen Sie nur die Werte in a, die sich von allen Werten in b unterscheiden.

jq -n --argfile a file0.json --argfile b file1.json ' 
    $a.d.aaData[].a as $a 
    | select([$b[].b] 
    | all(. != $a)) 
    | {key: $a}' 
+0

T Hank du sehr viel !! Funktioniert perfekt :) – FJunqueira

0

Hier ist eine Lösung, die den jq - Array Differenzoperator verwendet:

[ $file0.d.aaData[] | {key:.a} ] 
    - [ $file1[]   | {key:.b} ] 
| .[]  

filter.json diese Filter

dann

jq -M -n --argfile file0 file0.json --argfile file1 file1.json -f filter.json 

produziert enthält Angenommen

{ 
    "key": 3 
} 
{ 
    "key": 4 
}