2017-08-07 3 views
0

TL; DR: Bei einer Eingabedatei mit einer Reihe von Schlüsselpaaren möchte ich das drittletzte und das viertletzte Paar auswählen. Ich kann sie einzeln bekommen, aber ich möchte beide auf einmal nehmen, wenn möglich. Kann das gemacht werden?jq: Bereich auswählen

Meine Eingabedatei ist wie folgt strukturiert;

[ 
{ 
    "foo": "bar", 
    "foo2": "bar2" 
}, 
{ 
    "foo3": "bar3", 
    "foo4": "bar4" 
}, 
{ 
    "foo5": "bar5", 
    "foo6": "bar6" 
}, 
{ 
    "foo7": "bar7", 
    "foo8": "bar8" 
}, 
{ 
    "foo9": "bar9", 
    "foo10": "bar10" 
} 
] 

Und meine Ausgabe

[ 
{ 
    "foo3": "bar3", 
    "foo4": "bar4" 
}, 
{ 
    "foo5": "bar5", 
    "foo6": "bar6" 
} 
] 

Ich weiß sein sollte ich jq -s '.[-3]' tun kann, die 3.-to-last zu bekommen (und Swap mit einem 4 für den 4.-to-last), aber das packt sie getrennt.

Ich dachte aus der Dokumentation, dass jq -s '.[-3;-4]' würde beide greifen, aber das wirft einen Fehler.

Ich könnte sie einzeln greifen und an jedem separat arbeiten, aber das ist schlampig Code. Gibt es eine sauberere Möglichkeit, beides auf einmal zu greifen?

Antwort

1
  1. Lassen Sie die Option -s fallen. Ihre Eingabe ist bereits ein Array.

  2. Die Filter zu verwenden: -

Erklärung [[3, -4.]]: .[a,b] ist wie .[a],.[b]. Die äußeren Klammern machen daraus ein Array.

Eine beliebige Anzahl von Indizes kann auf diese Weise angegeben werden, und die Reihenfolge, in der sie angezeigt werden, bestimmt die Reihenfolge der Elemente im Ergebnis.

1

Wenn Sie Wertebereiche in einem Array auswählen möchten, können Sie die Slice-Syntax verwenden:

<start-index>:<end-index> 

Denken Sie daran, dass das Ende Index exklusiv ist (und nicht inklusive) und sollte ansteigender Reihenfolge werden.

So das dritte/vierte vom Ende zu bekommen:

.[-4:-2] 
Verwandte Themen