2017-07-04 8 views
0

Ich bin neu bei jq und versuche immer noch, die Grundlagen von JSON zu lernen, also entschuldige bitte meinen Mangel an Wissen. Ich finde das Werkzeug erstaunlich schnell, aber ich kämpfe um die Ergebnisse, die ich brauche. Ich bin sicher, dass es möglich ist, wie ich es einmal durch Zufall gemacht habe :( Ich habe Eingangsdaten, wiejq Split-Array in zwei Arrays

[ 
    {"time":1499150456,"data":{"power":{"bus":3.88,"shunt":6.98,"load":3.89,"current":76.00},"light":{"light":21}}}, 
    {"time":1499150516,"data":{"power":{"bus":3.93,"shunt":1.67,"load":3.93,"current":16.20},"light":{"light":21}}}, 
    {"time":1499150576,"data":{"power":{"bus":3.92,"shunt":5.58,"load":3.93,"current":25.30},"light":{"light":21}}}, 
    {} 
] 

ich es zu etwas entnehmende wie

[ 
    1499150456, 
    1499150516, 
    1499150576 
    ] 
    [ 
    76.00, 
    16.20, 
    25.30 
    ] 

Was habe ich so weit davon entfernt war.

cat inputFile.json | jq -C '.[] | select (length > 0)' 

, die ohne den letzten leeren Datensatz schön anfänglichen Array gibt Als nächst ich bin in der Lage zu tun

cat inputFile.json | jq -C '.[] | select (length > 0) | .time, .data.power.current' 

Das Ergebnis ist sehr nahe, aber nicht genau das, was ich brauche. Ich wollte Karte (.time) verwenden, die ich in einem Beispiel fand, aber das führte zu einem Fehler - nicht sicher, wie man es benutzt und die Beispiele funktionierten für mich bisher nicht.

Antwort

1

Der folgende Filter erzeugt die Ausgabe genau, wie beschrieben:

map(select(.time)) 
| map(.time), map(.data.power.current) 

Dies als Karte analysiert wird (...) | (map (...), map (...)), was zu einem Stream aus zwei JSON-Arrays führt.

+0

Egal, was ich versuche, ich am Ende immer mit „nicht-Indexnummer mit String“ versuchte ich 'jq -r‘ []. | Wählen Sie (Länge> 0) | map (select (.time)) '' aber das erzeugt immer den gleichen Fehler. Dank der Länge Teil sollte es den leeren Datensatz überspringen, aber immer noch es nicht funktioniert :( –

+0

Vielleicht wollten Sie schreiben: 'Karte (wählen (Länge> 0) | wählen (. Zeit)) '? Oder vielleicht:'. [] | select (length> 0 and .time) '? – peak

+0

Also habe ich versucht: ' jq -C '. [] | select (length> 0 und .time) | map (.time)' ' und ' jq -C '. [] | select (length> 0) | map (select (.time))' ' und beide landen in' Can not index number with string "time" ' –

-2

Zunächst können Sie ein neues JSON-Objekt erstellen. Vor dem Kreppen sollten Sie Daten in einem neuen Array sammeln;

var timeData=[]; 
var currentData=[]; 
var mergedJsonData={}; 

var yourJsonDataLenght= JSON.yourJsonData.length; 

for (infoIndex = 0; infoIndex < yourJsonDataLenght; infoIndex++) { 

    timeData.push(JSON.yourJsonData.time[infoIndex]); 
    currentData.push(JSON.yourJsonData.time[infoIndex].power.current); 
} 

mergedJsonData.push(timeData); 
mergedJsonData.push(currentData);