2016-08-18 1 views
2

mit Ich habe folgende jsonÄnderung der json jq in bash

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : [ 
      "val1" 
      ], 
     "field2" : [ 
      "val2" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val3" 
      ], 
     "field2" : [ 
      "val4" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val5" 
      ], 
     "field2" : [ 
      "val6" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    } 
    ] 
} 

Ich brauche die oben json der folgenden mit jq in bash i

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : "val1", 
     "field2" : "val2", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val3", 
     "field2" : "val4", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val5", 
     "field2" : "val6", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    } 
    ] 

} 

Hier bin ändern Sie die folgenden Fragen, mit denen :

Ich habe versucht, die innere JSON mit Tag-Werte zu analysieren und die '[' '' 'mit Leerzeichen zu ersetzen, aber wenn ich versuche, die "Werte" in einer Variablen in der Form der Liste zu setzen, jq ist hübsch und dann zeigt jeder neue Zeile als Element eines Arrays.

Die Anzahl der inneren Jons im Array Werte ist nicht festgelegt.

Kann mir bitte jemand helfen bei der Gestaltung der jq-Anweisung, die in bash ausgeführt werden soll, um die erforderlichen Änderungen vorzunehmen.

+1

@fedorqui thnx, dass für den Hinweis auf, korrigiert die Frage – vamsi

+0

Wissen Sie, dass es speziell '.values ​​[] ist. Field1' und' .values ​​[]. Field2' Sie ändern möchten, oder ist es Irgendeine Singleton-Liste irgendwo, die auf einen einzigen Wert reduziert werden sollte? – chepner

+0

Ja "field1, field2, name" sind in jedem json festgelegt. Aber die Anzahl der Jons ist nicht festgelegt. – vamsi

Antwort

1

Dies sollte Arbeit; Ich bin mir nicht sicher, ob es einen Weg gibt, die Zuordnungen zu field1 und field2 Refactoring:

jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json 
+0

Eine weitere Option besteht darin, ein Objekt mit den neuen Werten zu erstellen und es zusammenzuführen. Aber ich denke, das ist hässlicher und möglicherweise destruktiver als die Aufgaben. –

+0

Basierend auf dem Namen dachte ich, "foreach" könnte relevant sein, aber ich kann mich nicht daran erinnern, wie es funktioniert. Es war alles, was ich tun konnte, um etwas wie "jq" .values ​​[] | = (foreach ["field1", "field2"] als $ f (leer;. [$ F] =. [$ F] [ 0]; leer)) 'tmp1.json', das mindestens übereinstimmt; Es produziert keine Ausgabe. – chepner

+0

In meinem Kopf ist "foreach" wie "verkleinern", aber mit einem zusätzlichen Extraktionsteil. In Ihrem Beispiel in Ihrem Kommentar wurden Sie mit einem leeren Wert initialisiert und versuchen, ihm Werte zuzuweisen. Aber leer ist leer, so dass es für jede Iteration keine Ergebnisse liefert. Dann für den Extraktionsteil, extrahierst du leer, also kommt nichts davon. Mit diesem Ansatz könntest du bei "reduce" bleiben (mit einer leichten Anpassung): '.values ​​[] | = reduce (" field1 "," field2 ") als $ f (.;. [$ F] =. [ $ f] [0]) ' –

2

Das Snippet sollte unten tun, was Sie wollen:

jq '{ 
    "name": .name, 
    "values": [ 
     { 
      "field1" : .values[0].field1[0], 
      "field2" : .values[0].field2[0], 
      "New_name": .values[0].name1 
     }, 
     { 
      "field1" : .values[1].field1[0], 
      "field2" : .values[1].field2[0], 
      "new_name" : .values[1].name1 
     }, 
     { 
      "field1" : .values[2].field1[0], 
      "field2" : .values[2].field2[0], 
      "new_name" : .values[2].name1 
     } 
    ] 
}' < /tmp/input.json 

EDIT

Da die Anzahl der Objekte, die nicht behoben werden, unter das Snippet tun:

jq '{ 
     "name" : .name, 
     "values" : [ 
       .values[] as $in | 
       { 
         "field1" : $in.field1[0], 
         "field2" : $in.field2[0], 
         "new_name" : $in.name1 
       } 
     ] 

}' < /tmp/input.json 
+0

thnx für die schnelle Antwort. Die Anzahl der inneren jsons im Werte-Array ist jedoch nicht festgelegt. – vamsi

0

Hier ist eine andere Lösung.

.values |= map({ 
    field1: .field1[0], 
    field2: .field2[0], 
    new_name: .name1 
    })