2017-01-12 4 views
0

Kann ich mit jq einen Filter ausführen, der sich ähnlich wie from_entries verhält, mit dem Unterschied, dass wenn mehrere Einträge für den gleichen Schlüssel gefunden werden, die Werte sortiert werden ein Array, anstatt nur den letzten Wert zu verwenden?Variante von jq aus_Einträge, die Werte für jedes Schlüsselvorkommen sortieren

Wenn ja, welcher Filter würde dies erreichen? Zum Beispiel, wenn meine Eingabe ist:

[ 
    { 
    "key": "a", 
    "value": 1 
    }, 
    { 
    "key": "b", 
    "value": 2 
    }, 
    { 
    "key": "a", 
    "value": 3 
    }, 
    { 
    "key": "b", 
    "value": 4 
    } 
] 

dann würde die gewünschte Ausgabe sein:

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

Beachten Sie, dass unter Verwendung von ‚from_entries‘ allein als Filter, die resultierenden Werte sind nur der letzte Wert (das heißt, { "a": 3, "b": 4 })

Antwort

1

Mit Ihrem Beispiel und die folgenden Zeilen in merge.jq:

def merge_entries: 
    reduce .[] as $pair ({}; .[$pair["key"]] += [$pair["value"]]); 

merge_entries 

der Aufruf: jq -c -f merge.jq ergibt:

jq 'reduce .[] as $p ({}; .[$p.key] += [$p.value])' 
+0

, die perfekt funktioniert:

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

Sie auch den Aufruf nutzen könnten. Danke! – mwag

+0

Entschuldigung für das Missverstehen der ursprünglichen Frage. Ich war abgelenkt von einigen Aspekten des ersten Absatzes. Selbst jetzt heißt es "wenn mehrere Einträge des gleichen Schlüssels existieren", ohne zu spezifizieren, was zu tun ist, wenn das nicht der Fall ist. – peak

+0

Nein, du hattest Recht. Ich fing an, es aus einem Blickwinkel zu schreiben, wechselte dann die Hälfte durch und aktualisierte den Anfang nicht, um ihn konsistent zu machen. Ich habe weiter eingegrenzt und aktualisiert nach Ihrem letzten Kommentar, hoffentlich besser jetzt, fühlen Sie sich frei, LMK, wenn nicht. Ty – mwag