2015-02-26 28 views
6

Tôi có một tệp JSON lớn là đối tượng của các đối tượng mà tôi muốn chia thành các tên tệp riêng biệt sau các khóa đối tượng. Có thể đạt được điều này bằng cách sử dụng jq hoặc bất kỳ công cụ nào khác không?Chia một tệp JSON thành các tệp riêng biệt

Các JSON ban đầu là theo định dạng sau

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

Với đầu vào này, tôi muốn tạo ra file item1.json, item2.json, vv

+0

Bạn có muốn chuyển đổi nó thành các tệp khác nhau là các biến khác nhau không? Có rất nhiều cách, bạn có thể chuyển đổi thành các biến khác nhau. – Rajeshwar

+0

Tôi muốn chuyển đổi từng đối tượng được biểu thị bằng khóa riêng của nó thành một tệp riêng biệt. Có cách nào để làm điều đó với jq hoặc các công cụ tương tự? – kissaprofeetta

+0

Bạn chỉ có thể tạo một đầu ra tại một thời điểm. Chỉ cần tạo ra một kịch bản mà sẽ nhận được tất cả các tên mục, sau đó ngã ba ra jq cuộc gọi để có được những mục ra và lưu vào một tập tin. –

Trả lời

7

này sẽ cho bạn một sự khởi đầu:

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

Cảm ơn rất nhiều. Nó đã làm các trick! – kissaprofeetta

+2

Để đảm bảo hành vi thích hợp khi có bất kỳ tên khóa nào, cần viết ". [\" $ F \ "]" thay vì ". $ F" – peak

2

Dưới đây là một giải pháp mà chỉ cần một cuộc gọi đến 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 

Nó có thể là nhanh hơn để ống đầu ra của lệnh JQ để awk, ví dụ:

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

Tất nhiên, những cách tiếp cận sẽ cần phải được sửa đổi nếu những cái tên quan trọng chứa các ký tự mà không thể được sử dụng trong tên tệp.

Các vấn đề liên quan