2017-02-27 5 views
0

Ich habe eine JSON-Datei (input.json), die wie folgt aussieht:Einzigartige Kombinationen von unterschiedlichen Werten in json mit jq

{"header1":"a","header2":1a, "header3":1a, "header4":"apple"}, 
{"header1":"b","header2":2a, "header3":2a, "header4":"orange"} 
{"header1":"c","header2":1a, "header3":2a, "header4":"banana"}, 
{"header1":"d","header2":2a, "header3":1a, "header4":"apple"}, 
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"}, 
{"header1":"b","header2":1a, "header3":2a, "header4":"orange"}, 
{"header1":"b","header2":1a, "header3":1a, "header4":"orange"}, 
{"header1":"d","header2":1a, "header3":1a, "header4":"apple"}, 
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"} (repeat of line 5) 

Ich möchte nur die eindeutigen Kombinationen von jedem der Werte jq auszufiltern. Die Ergebnisse sollten wie folgt aussehen:

{"header1":"a","header2":1a, "header3":1a, "header4":"apple"}, 
{"header1":"b","header2":2a, "header3":2a, "header4":"orange"} 
{"header1":"c","header2":1a, "header3":2a, "header4":"banana"}, 
{"header1":"d","header2":2a, "header3":1a, "header4":"apple"}, 
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"}, 
{"header1":"b","header2":1a, "header3":2a, "header4":"orange"}, 
{"header1":"b","header2":1a, "header3":1a, "header4":"orange"}, 
{"header1":"d","header2":1a, "header3":1a, "header4":"apple"} 

ich von header1 mit den anderen Header tun Gruppe versucht, aber es nicht erzeugen einzigartige Ergebnisse. Ich habe unique verwendet, aber das erzeugte nicht die richtigen Ergebnisse.

Wie kann ich das bekommen? Ich bin neu bei jq und finde nicht viele Tutorials dazu.

Dank

Antwort

0
  1. Die Probe Linien, die Sie geben, sind nicht gültig JSON. Da Ihre Präambel sie als JSON einführt, wird im folgenden davon ausgegangen, dass Sie ein Array von JSON-Objekten darstellen wollten.

  2. Die Frage ist in mehrfacher Hinsicht unklar, aber aus dem Beispiel, es sieht aus, als ob unique sein könnte, was Sie suchen, so betrachten:

Invocation: jq -c ‚einzigartige [ ‚] input.json

Ausgang:

{"header1":"a","header2":"1a","header3":"1a","header4":"apple"} 
{"header1":"a","header2":"2a","header3":"1a","header4":"banana"} 
{"header1":"b","header2":"1a","header3":"1a","header4":"orange"} 
{"header1":"b","header2":"1a","header3":"2a","header4":"orange"} 
{"header1":"b","header2":"2a","header3":"2a","header4":"orange"} 
{"header1":"c","header2":"1a","header3":"2a","header4":"banana"} 
{"header1":"d","header2":"1a","header3":"1a","header4":"apple"} 
{"header1":"d","header2":"2a","header3":"1a","header4":"apple"} 
  1. Wenn Sie die Ausgabe in einem anderen Format benötigen, könnten Sie d o dass die Verwendung von jq als gut, aber die Anforderungen sind nicht so klar, so lassen Sie sich das als eine Übung lassen :-)
+0

meine Frage aktualisiert, bitte noch einmal. Ich möchte einzigartige Kombinationen von jedem Wert erzeugen, indem ich nur diese bestimmten Schlüssel auswähle – user2340345

0

Da als peak Ihre Eingabe angezeigt ist nicht legal JSON ich mir die Freiheit genommen habe Korrektur sie und die Umwandlung in eine Liste einzelner Objekte:

{"header1":"a","header2":"1a", "header3":"1a", "header4":"apple"} 
{"header1":"b","header2":"2a", "header3":"2a", "header4":"orange"} 
{"header1":"c","header2":"1a", "header3":"2a", "header4":"banana"} 
{"header1":"d","header2":"2a", "header3":"1a", "header4":"apple"} 
{"header1":"a","header2":"2a", "header3":"1a", "header4":"banana"} 
{"header1":"b","header2":"1a", "header3":"2a", "header4":"orange"} 
{"header1":"b","header2":"1a", "header3":"1a", "header4":"orange"} 
{"header1":"d","header2":"1a", "header3":"1a", "header4":"apple"} 
{"header1":"a","header2":"2a", "header3":"1a", "header4":"banana"} 

Wenn diese Daten in data.json ist und Sie laufen

jq -M -s -f filter.jq data.json 

mit den folgenden filter.jq

foreach .[] as $r (
    {} 
; ($r | map(.)) as $p | if getpath($p) then empty else setpath($p;1) end 
; $r 
) 

wird die folgende Ausgabe in der ursprünglichen Reihenfolge ohne Duplikate generiert.

{"header1":"a","header2":"1a","header3":"1a","header4":"apple"} 
{"header1":"b","header2":"2a","header3":"2a","header4":"orange"} 
{"header1":"c","header2":"1a","header3":"2a","header4":"banana"} 
{"header1":"d","header2":"2a","header3":"1a","header4":"apple"} 
{"header1":"a","header2":"2a","header3":"1a","header4":"banana"} 
{"header1":"b","header2":"1a","header3":"2a","header4":"orange"} 
{"header1":"b","header2":"1a","header3":"1a","header4":"orange"} 
{"header1":"d","header2":"1a","header3":"1a","header4":"apple"} 

beachte, dass die

($r | map(.)) 

verwendet wird, um ein Array zu erzeugen, nur die Werte aus jeder Zeile enthält, die angenommen wird, um immer einen eindeutigen Schlüssel Pfad zu erzeugen. Dies gilt für die Beispieldaten aber möglicherweise nicht für komplexere Werte.

Ein langsamer, aber robuster filter.jq ist

foreach .[] as $r (
    {} 
; [$r | tojson] as $p | if getpath($p) then empty else setpath($p;1) end 
; $r 
) 

die die json Darstellung der gesamten Zeile als eindeutiger Schlüssel verwendet, um zu bestimmen, ob eine Zeile zuvor gesehen wurde.

Verwandte Themen