2015-02-26 14 views
6

Mam duży plik JSON, który jest obiektem obiektów, który chciałbym podzielić na osobne pliki nazwa po kluczach obiektów. Czy można to osiągnąć za pomocą jq lub innych gotowych narzędzi?Podziel plik JSON na osobne pliki

Oryginalny JSON jest w następującym formacie

{ "item1": {...}, "item2": {...}, ...}

Given to wejście chciałbym produkować pliki item1.json, item2.json itp

+0

Czy chcesz przekonwertować go na różne pliki są różne zmienne? Jest tak wiele sposobów, za pomocą których można konwertować na różne zmienne. – Rajeshwar

+0

Chcę przekonwertować każdy obiekt reprezentowany przez jego własny klucz do osobnego pliku. Czy jest jakiś sposób, aby to zrobić za pomocą jq lub podobnych narzędzi? – kissaprofeetta

+0

Można wygenerować tylko jedno wyjście na raz. Po prostu utwórz skrypt, który będzie zawierał wszystkie nazwy przedmiotów, a następnie rozwiąż połączenia jq, aby uzyskać te elementy i zapisać je do pliku. –

Odpowiedz

7

Powinno to dać początek:

for f in `cat input.json | jq -r 'keys[]'` ; do 
    cat input.json | jq ".$f" > $f.json 
done 
+0

Wielkie dzięki. Zrobiło to! – kissaprofeetta

+2

Aby zapewnić prawidłowe zachowanie w obecności jakiejkolwiek nazwy klucza, konieczne byłoby napisanie ". [\" $ F \ "]" zamiast ". $ F" – peak

2

Oto rozwiązanie, które wymaga tylko jednego połączenia do JQ:

jq -cr 'keys[] as $k | "\($k)\n\(.[$k])"' input.json | 
    while read -r key ; do 
    read -r item 
    printf "%s\n" "$item" > "/tmp/$key.json" 
    done 

Może być szybciej rury wyjście polecenia JQ do awk, np:

jq -cr 'keys[] as $k | "\($k)\t\(.[$k])"' input.json | 
    awk -F\\t '{ print $2 > "/tmp/" $1 ".json" }' 

Oczywiście, takie podejście będzie musiał zostać zmodyfikowany, jeśli klucz nazwy zawierają znaki, które nie mogą być wykorzystane w nazwy plików.