2016-07-08 12 views
5

मैं दो JSON टेक्स्ट फ़ाइलों को अलग करना चाहता हूं। दुर्भाग्यवश वे मनमाने ढंग से क्रम में निर्मित किए गए हैं, इसलिए जब वे अर्थात् समान होते हैं तो मुझे भिन्नता मिलती है। मैं केवल ऑर्डर करने के लिए मतभेदों को खत्म करने के लिए, किसी भी प्रकार के पूर्ण क्रम में सॉर्ट करने के लिए jq (या जो कुछ भी) का उपयोग करना चाहता हूं।मैं jq का उपयोग करके मनमाने ढंग से JSON कैसे पूरी तरह से व्यवस्थित कर सकता हूं?

--ॉर्ट-चाबियाँ आधा समस्या हल करती हैं, लेकिन यह सरणी को सॉर्ट नहीं करती है।

मैं jq की बहुत अनजान हूं और यह नहीं जानता कि एक जेक रिकर्सिव फ़िल्टर कैसे लिखना है जो सभी डेटा को संरक्षित करता है; किसी भी सहायता की सराहना की जाएगी।

मुझे एहसास है कि लाइन-दर-रेखा 'diff' आउटपुट दो जटिल वस्तुओं की तुलना करने का सबसे अच्छा तरीका नहीं है, लेकिन इस मामले में मुझे पता है कि दो फाइलें बहुत समान हैं (लगभग समान) और लाइन-बाय- लाइन diffs मेरे उद्देश्यों के लिए ठीक हैं।

Using jq or alternative command line tools to diff JSON files एक बहुत ही समान प्रश्न का उत्तर देता है, लेकिन मतभेदों को मुद्रित नहीं करता है। साथ ही, मैं क्रमबद्ध परिणामों को सहेजना चाहता हूं, इसलिए जो मैं वास्तव में चाहता हूं वह JSON को सॉर्ट करने के लिए केवल एक फ़िल्टर प्रोग्राम है।

+2

([diff JSON फ़ाइलों को JQ या वैकल्पिक कमांड लाइन उपकरण का उपयोग] की संभावित डुप्लिकेट http://stackoverflow.com/questions/31930041/using-jq-or-alternative-command- लाइन-टूल्स-टू-डिफ-जेसन-फाइलें) –

उत्तर

5

यहां एक सामान्य फ़ंक्शन sorted_walk/1 (इसलिए नीचे पोस्टस्क्रिप्ट में वर्णित कारण के लिए नामित) का उपयोग करके एक समाधान है।

normalize.jq: का उपयोग कर बैश

# Apply f to composite entities recursively using keys[], and to atoms 
def sorted_walk(f): 
    . as $in 
    | if type == "object" then 
     reduce keys[] as $key 
     ({}; . + { ($key): ($in[$key] | sorted_walk(f)) }) | f 
    elif type == "array" then map(sorted_walk(f)) | f 
    else f 
    end; 

def normalize: sorted_walk(if type == "array" then sort else . end); 

normalize 

उदाहरण:

diff <(jq -S -f normalize.jq FILE1) <(jq -S -f normalize.jq FILE2) 

उपसंहार: इस प्रतिक्रिया के बाद पहली पोस्ट किया गया walk/1 की अंतर्निहित परिभाषा संशोधित किया गया था: यह अब keys_unsorted का उपयोग करता है keys के बजाए।

+0

बस मुझे जो चाहिए, धन्यवाद! मैंने देखा है कि आपने संबंधित पोस्ट में इस समाधान की एक भिन्नता पोस्ट की है, लेकिन यहां सरल उदाहरण ने कई प्रश्नों का उत्तर दिया। –

3

मैं दो JSON टेक्स्ट फ़ाइलों को अलग करना चाहता हूं।

-set विकल्प के साथ उपयोग jd:

कोई उत्पादन में कोई अंतर नहीं होता है।

$ jd -set A.json B.json 

अंतर @ पथ और + या - के रूप में दिखाए जाते हैं।

$ jd -set A.json C.json 

@ ["People",{}] 
+ "Carla" 

उत्पादन डिफ भी -p विकल्प के साथ पैच फ़ाइलें के रूप में इस्तेमाल किया जा सकता।

$ jd -set -o patch A.json C.json; jd -set -p patch B.json 

{"City":"Boston","People":["John","Carla","Bryan"],"State":"MA"} 

https://github.com/josephburnett/jd#command-line-usage

संबंधित मुद्दे

 संबंधित मुद्दे