2010-03-16 12 views
16

में एक साहचर्य सरणी मैं awk में एक साहचर्य सरणी है कि इस तरह आबादी वाले हो जाता है आश्चर्य की बात है, मैं आदेश किसी भी तरह से हल नहीं किया गया है। chr_count की क्रमबद्ध कुंजी पर पुन: प्रयास करने का कोई आसान तरीका है?क्रमबद्ध awk

+2

http://stackoverflow.com/a/5345056/69663 देखें - यदि आपके पास गॉक 4 है, तो PROCINFO ["sorted_in"] = "@val_num_asc" आदि का उपयोग करना बहुत आसान है। यदि आप उतरते/चढ़ते हैं, मूल्य/कुंजी, संख्यात्मक/कड़ाई से, अपना स्वयं का फ़ंक्शन इत्यादि: मैन्युअल कई अलग-अलग विकल्पों को दिखाता है: https://www.gnu.org/software/gawk/manual/html_node/Controlling- स्कैनिंग – unhammer

उत्तर

22

asort के बजाय , asorti(source, destination) जो एक नई सरणी में सूचकांक क्रमबद्ध करता का उपयोग करें और आप सरणी की प्रतिलिपि करने के लिए नहीं होगा।

फिर आप गंतव्य सरणी को पॉइंटर्स के रूप में स्रोत सरणी में उपयोग कर सकते हैं।

अपने उदाहरण के लिए, आप इसे इस तरह का प्रयोग करेंगे:

n=asorti(chr_count, sorted) 
for (i=1; i<=n; i++) { 
     print sorted[i] " : " chr_count[sorted[i]] 
} 
+0

वाह, दस्तावेजों में इसे ठीक से पढ़ने के बावजूद पूरी तरह से भूल गए। यह निश्चित रूप से बेहतर जवाब है। – Cascabel

+0

+1 शानदार !!! –

+1

'asorti' nawk-20121220-2.fc20.x86_64 के साथ काम नहीं करता है। –

4

यह the documentation से सीधे लिया जाता है:

populate the array data 
# copy indices 
j = 1 
for (i in data) { 
    ind[j] = i # index value becomes element value 
    j++ 
} 
n = asort(ind) # index values are now sorted 
for (i = 1; i <= n; i++) { 
    do something with ind[i]   Work with sorted indices directly 
    ... 
    do something with data[ind[i]]  Access original array via sorted indices 
} 
+0

देखें, यह समाधान त्रुटिपूर्ण है क्योंकि यह खोने वाली कुंजी को समाप्त करता है जिसमें मूल सरणी में समान मान होते हैं। इस अन्य धागे से स्वीकार्य समाधान के बारे में एक विचार है कि इसे कैसे कार्य करना है: http://stackoverflow.com/a/5345056/95750 – haridsv

+1

@haridsv नहीं, मुझे ऐसा नहीं लगता है।यह प्रश्न कुंजी द्वारा क्रमबद्ध करने के बारे में है, मूल्यों के नहीं, और एक ही कुंजी के लिए दो मान नहीं हो सकते हैं, इसलिए यहां कोई समस्या नहीं है। आप जिस दूसरे प्रश्न को इंगित करते हैं वह मानों द्वारा क्रमबद्ध करने के बारे में है (जो वास्तव में सभी अलग नहीं हो सकते हैं), इसलिए यदि आपने इसके लिए इस कोड का उपयोग करने का प्रयास किया है, तो यह एक समस्या होगी। लेकिन अगर आप इसके लिए लिखे गए कार्यों के लिए इसका इस्तेमाल करते हैं तो यह त्रुटिपूर्ण नहीं है। – Cascabel

+0

माफ़ी .. मैं इंडेक्सिंग कोड को "फ़्लिपिंग" कुंजी/मानों के रूप में गलत तरीके से पढ़ता हूं, लेकिन इसे फिर से पढ़ने के बाद, मैंने देखा है कि आप लगातार बढ़ते नंबर का उपयोग इंडेक्स के रूप में कर रहे हैं, मूल मूल्य नहीं। वापस पाने और इसे स्पष्ट करने के लिए धन्यवाद। – haridsv

6

ध्यान दें कि asort() और asorti() घूर रहा विशिष्ट हैं, और awk के लिए अज्ञात हैं। सादा अजीब के लिए, आप अपना खुद का sort() रोल कर सकते हैं या कहीं और से एक प्राप्त कर सकते हैं।

11

आप सॉर्ट कमांड का उपयोग कर सकते हैं। जैसे

for (i in data) 
print i ":", data[i] | "sort" 
0

मैं हाल ही में इस मुद्दे में आए और पाया gawk साथ मैं यात्रा के क्रम को नियंत्रित करने के PROCINFO["sorted_in"] का मान सेट कर सकते हैं। मैं ऑनलाइन PROCINFO के लिए खोज के द्वारा इस के लिए मान्य मानों की सूची मिल गया है और यह जीएनयू Awk उपयोगकर्ता मार्गदर्शिका पेज पर उतरा: https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

इस के साथ सूचीबद्ध करता प्रपत्र @{key|val}_{num|type|str}_{asc|desc} का विकल्प:

  • key कुंजी और val द्वारा छँटाई मूल्य से छंटनी।
  • num संख्यात्मक रूप से क्रमबद्ध, str स्ट्रिंग द्वारा type असाइन किए गए प्रकार से।
  • asc आरोही क्रम के लिए और desc अवरोही क्रम के लिए।

मैं बस प्रयोग किया है:

PROCINFO["sorted_in"] = "@val_num_desc" 
for (i in map) print i, map[i] 

और उत्पादन मूल्यों के घटते क्रम में क्रमबद्ध किया गया था।

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