2013-09-24 9 views
9

में सूची कुंजी के लिए jq का उपयोग करना मेरे पास एक वैज्ञानिक उपकरण द्वारा बनाई गई श्रेणीबद्ध रूप से गहरी JSON ऑब्जेक्ट है, इसलिए फ़ाइल कुछ हद तक बड़ी (1.3MB) है और लोगों द्वारा आसानी से पठनीय नहीं है। मैं JSON ऑब्जेक्ट के लिए, एक निश्चित गहराई तक, कुंजी की एक सूची प्राप्त करना चाहता हूं। उदाहरण के लिए, इसJSON ऑब्जेक्ट

{ 
    "acquisition_parameters": { 
     "laser": { 
      "wavelength": { 
       "value": 632, 
       "units": "nm" 
      } 
     }, 
     "date": "02/03/2525", 
     "camera": {} 
    }, 
    "software": { 
     "repo": "github.com/username/repo", 
     "commit": "a7642f", 
     "branch": "develop" 
    }, 
    "data": [{},{},{}] 
} 

जैसे इनपुट ऑब्जेक्ट को मुझे ऐसा आउटपुट चाहिए।

{ 
    "acquisition_parameters": [ 
     "laser", 
     "date", 
     "camera" 
    ], 
    "software": [ 
     "repo", 
     "commit", 
     "branch" 
    ] 
} 

यह गणना करने में क्या एक JSON ऑब्जेक्ट में सक्षम किया जा रहा है के प्रयोजन के लिए मुख्य रूप से है। उपकरण से जेएसओएन ऑब्जेक्ट्स को प्रोसेस करने के बाद अलग हो जाना शुरू हो जाता है: उदाहरण के लिए, कुछ में .frame.cross_section.stats.fwhm जैसे फ़ील्ड हो सकते हैं, जबकि अन्य .sample.species हो सकते हैं, इसलिए कमांड लाइन पर JSON ऑब्जेक्ट से पूछताछ करने में सक्षम होना सुविधाजनक होगा।

उत्तर

10

आप क्या चाहते हैं वास्तव में क्या करना चाहिए निम्नलिखित

jq '[(keys - ["data"])[] as $key | { ($key): .[$key] | keys }] | add' 

यह निम्न उत्पादन दे देंगे, इनपुट आप ऊपर वर्णित का उपयोग कर:

{ 
    "acquisition_parameters": [ 
    "camera", 
    "date", 
    "laser" 
    ], 
    "software": [ 
    "branch", 
    "commit", 
    "repo" 
    ] 
} 
3

उद्देश्य को देखते हुए आप इनपुट में सभी रास्तों सूची paths builtin का उपयोग कर एक आसान समय है और फिर इच्छित गहराई में काट-छांट कर सकते हैं:

$ echo '{"a":{"b":{"c":{"d":true}}}}' | jq -c '[paths|.[0:2]]|unique' 
[["a"],["a","b"]] 
0

यहाँ एक और भिन्नता uing को कम और setpath जो मानता है कि आपके उच्च-स्तरीय चाबियों का एक विशिष्ट सेट है आप परीक्षण करना चाहते है:

. as $v 
| reduce ("acquisition_parameters", "software") as $k (
    {}; setpath([$k]; $v[$k] | keys) 
) 
संबंधित मुद्दे