जैसा कि अन्य ने कहा है, यह बॉक्स के बाहर इस तरह की कोई कार्यक्षमता प्रदान नहीं करता है। आपका "हैकिश" वर्कअराउंड कुछ डेटासेट के लिए काम कर सकता है, लेकिन दूसरों को नहीं। ध्यान दें कि आप एक ही सरणी मान को दो बार जोड़ सकते हैं, और इसे सरणी के भीतर दो बार प्रदर्शित करना चाहते हैं।
$ echo 3 | awk 'BEGIN{ a[1]=5; a[2]=12; a[3]=2 }
> { a[$1] = $1 }
> END {print length(a) " - " a[3]}'
3 - 3
डेटा द्वारा सबसे अच्छा समाधान जानकारी दी जा सकती है, लेकिन यहां कुछ विचार हैं।
सबसे पहले, यदि आप निश्चित हैं कि आपकी अनुक्रमणिका हमेशा संख्यात्मक होगी, तो हमेशा 1 से शुरू होगी, और आप कभी भी एरे तत्वों को हटा नहीं देंगे, फिर A[length(A)+1]="value"
का ट्रिपल का सुझाव आपके लिए काम कर सकता है। लेकिन यदि आप कोई तत्व हटाते हैं, तो आपका अगला लेखन आपके अंतिम तत्व को ओवरराइट कर सकता है।
अपने सूचकांक कोई फर्क नहीं पड़ता है, और आप लंबे समय तक कुंजी के साथ अंतरिक्ष बर्बाद कर के बारे में चिंतित नहीं हैं, तो आप एक यादृच्छिक संख्या है कि काफी लंबे समय से टकराव की संभावना को कम करने के लिए इस्तेमाल कर सकते हैं। एक त्वरित & गंदा विकल्प हो सकता है:
srand()
a[rand() rand() rand()]="value"
बेहतर यादृच्छिकीकरण के लिए srand()
उपयोग करने के लिए, और rand()
पर भरोसा नहीं करते वास्तविक यादृच्छिक संख्या का उत्पादन करने के लिए याद रखें। यह कई तरीकों से सही समाधान से कम है, लेकिन इसका कोड कोड की एक पंक्ति होने का लाभ है।
अपनी चाबी सांख्यिक लेकिन संभवतः विरल, उदाहरण है कि tripleee के समाधान टूट जाएगा के रूप में, आप अपने धक्का कार्य करने के लिए एक छोटी सी खोज में जोड़ सकते हैं कर रहे हैं:
function push (a, v, n) {
n=length(a)+1
while (n in a) n++
a[n]=v
}
जबकि पाश सुनिश्चित करता है कि आप ' एक अप्रयुक्त सूचकांक आवंटित करेंगे।यह फ़ंक्शन उन सारणियों के साथ भी संगत है जो गैर-संख्यात्मक सूचकांक का उपयोग करते हैं - यह संख्यात्मक हैं कुंजी जो संख्यात्मक हैं, लेकिन यह परवाह नहीं है कि पहले से मौजूद क्या है।
ध्यान दें कि awk किसी सरणी के तत्वों के क्रम की गारंटी नहीं देता है, इसलिए यह विचार है कि आप "किसी आइटम को सरणी के अंत में दबाएंगे" गलत है। आप इस तत्व को सरणी में जोड़ देंगे, लेकिन for
लूप के साथ चरणबद्ध होने पर यह गारंटी नहीं है कि यह आखिरी बार दिखाई देता है।
$ cat a
#!/usr/bin/awk -f
function push (a, v, n) {
n=length(a)+1
while (n in a) n++
a[n]=v
}
{
push(a, $0)
}
END {
print "length=" length(a)
for(i in a) print i " - " a[i]
}
$ printf '3\nfour\ncinq\n' | ./a
length=3
2 - four
3 - cinq
1 - 3
मैं उस सुरुचिपूर्ण और minimalist को कॉल करूँगा, हैकिश नहीं! ;-)। आप हमेशा अपने कार्यों को सरणी प्रबंधित करने के लिए लिख सकते हैं, लेकिन इसके लिए भाषा में कुछ भी नहीं बनाया गया है। सौभाग्य। – shellter