2016-02-21 14 views
8

मैं है निम्नलिखित सरणी:JQ प्रकार एकाधिक कुंजियों से उतरते

:

[{ 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

मैं इस सरणी इस एसक्यूएल के अनुरूप क्रमबद्ध करना चाहते हैं "द्वारा prop1 DESC आदेश, prop2 एएससी" इसलिए मैं इस परिणाम है

[{ 
    "name": "Object 2", 
    "prop1": 6, 
    "prop2": 4 
}, { 
    "name": "Object 1", 
    "prop1": 5, 
    "prop2": 2 
}, { 
    "name": "Object 3", 
    "prop1": 5, 
    "prop2": 3 
}] 

मैं एक सरणी को कैसे क्रमबद्ध कर सकता हूं ए) एक कुंजी से उतरकर और बी) एकाधिक कुंजी द्वारा?

संस्करण: 1.5

उत्तर

8

jQ JQ में, सरणियों तरह तत्वों वे होते हैं, के क्रम में की छंटाई द्वारा। यही कारण है:

$ jq -n '[1, 2] < [1, 3], [1, 2] < [2, 1]' 
true 
true 

sort_by फिल्टर एक सरणी सॉर्ट करता है कि सरणी के प्रत्येक सदस्य के लिए मूल्यांकन किया जाएगा तर्क के रूप में एक अभिव्यक्ति लेने। उदाहरण के लिए, आप लंबाई से शब्दों की एक सूची को सॉर्ट करना चाहते थे:

$ jq -n '["prop", "leo", "column", "blast"] | sort_by(length)' 
[ 
    "leo", 
    "prop", 
    "blast", 
    "column" 
] 

अभिव्यक्ति तर्क के रूप में sort_by करने के लिए दिया एक से अधिक मान देता है, तो रिटर्न मूल्यों परोक्ष एक सरणी में, लिपटे किया जाएगा जो उपरोक्त संदर्भित सरणी सॉर्टिंग नियमों के अधीन। उदाहरण के लिए, आप लंबाई से शब्दों की एक सूची सॉर्ट करने के लिए, और फिर वर्णानुक्रम चाहते थे:

$ jq -n '["pro", "leo", "column", "ablast"] | sort_by(length, .)' 
[ 
    "leo", 
    "pro", 
    "ablast", 
    "column" 
] 

यह जानने के बाद, और ध्यान में रखते हुए कि आपके उदाहरण में मान सांख्यिक हैं, तो आपको निम्न सिर्फ कर सकते हैं:

$ jq 'sort_by(-.prop1, .prop2)' 
संबंधित मुद्दे