2017-02-05 8 views
5

dies ist ein sehr einfach (wahrscheinlich dumme) Frage, aber ich kann es nicht an die Arbeit ...Muster passenden Feldnamen mit jq

Ich habe eine JSON-Datei mit dieser Struktur

{                                                            
    "data": { 
     "what a burger": [1,2,3], 
     "wap": [66], 
     "the map": [11,20], 
     "H. Incandenza": [1,1], 
     "What a burger": [a,a,3] 
    } 
} 

und ich möchte die Werte der Felder innerhalb Daten extrahieren, deren "Name" mit einem bestimmten Muster übereinstimmt. Zum Beispiel würde Ich mag alle Groß- und Kleinschreibung Zufälle „was ein Burger“ extrahieren

[1,2,3] zu bekommen, [a, a, 3]

Meine Vermutung wäre etwas, wie

jq '.data | match("what a burger";"i")' 

aber dies führt zu

jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string 

Beifall.

Antwort

2

Ihre Anweisung funktioniert nicht, weil Sie versuchen, das Datenobjekt in Übereinstimmung zu bringen, aber die Übereinstimmung kann nur für Zeichenfolgen funktionieren.

Der folgende Ausdruck wird tun, was Sie wollen. Die to_entries konvertiert das Objekt in ein Array von Schlüsseln und Werten. Dann iterieren wir über dieses Array, indem wir map und select alle Einträge verwenden, in denen .key (jetzt ein String) einen match hat. Schließlich drucken wir einfach den Wert jedes Elements aus.

.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value) 

jedoch zwei Bemerkungen:

  • Die [a,a,3] ist nicht in JSON erlaubt, weil a keine Zahl ist.
  • Es funktioniert, weil die Tasten tatsächlich anders sind, auch wenn nur der Groß-/Kleinschreibung nicht gleich ist. Wenn mindestens zwei Schlüssel identisch sind, treten Probleme auf, da Schlüssel eindeutig sein sollten. In der Tat wird jq nur dann eines der Elemente ausgeben.
+1

Die beiden 'map' Anrufe kann und sollte kombiniert werden. –

5

Hier ist eine etwas kürzere Alternative:

.data | with_entries(select(.key|match("what a burger";"i")))[] 

Nach der Eingabe Gleichrichtung und -c Option der Verwendung von jq, würde dies produzieren die zwei Linien:

[1,2,3] 
["a","a",3] 
+0

Ich mag diese, und half mir herauszufinden, alle Schlüssel zu erhalten: Werte, wenn der Schlüssel enthält ein Patern (oder uniq) Für alle Werte, wo Schlüsselname ist "Schlüsselname" '.data | with_entries (select (.key | match ("keyname +"; "ig"))) [] ' Für key: value mit dem gleichen Filer entfernen wir einfach das [] am Ende ... und funktioniert sogar, wenn ich will um mehr als ein Muster im Schlüsselnamen zu suchen wie: '.data | with_entries (wähle (.key | match ("contains1 +", "contains2 +"; "ig"))) ' konnte es nicht geschafft haben, ohne dass du ein Vorschlag bist, @peak also danke – Mikec