2012-05-25 11 views
15

मुझे लगता है कि awk साहचर्य सरणियों है, लेकिन मुझे आश्चर्य है कि अगर वहाँ इस के लिए एक awk बराबर है:क्या किसी इंडेक्स को निर्दिष्ट किए बिना किसी आइटम को अजीब में जोड़ना संभव है?

http://php.net/manual/en/function.array-push.php

स्पष्ट वैकल्पिक हल करने के लिए है सिर्फ इतना कहना:

array[$new_element] = $new_element 

बहरहाल, यह लगता है कम पढ़ने योग्य और इसकी तुलना में अधिक हैकिश होना चाहिए।

+2

मैं उस सुरुचिपूर्ण और minimalist को कॉल करूँगा, हैकिश नहीं! ;-)। आप हमेशा अपने कार्यों को सरणी प्रबंधित करने के लिए लिख सकते हैं, लेकिन इसके लिए भाषा में कुछ भी नहीं बनाया गया है। सौभाग्य। – shellter

उत्तर

8

मुझे नहीं लगता कि एक सरणी लंबाई तुरंत अजीब में उपलब्ध है (कम से कम उन संस्करणों में नहीं जो मैं चारों ओर झुका हुआ हूं)। लेकिन आप बस लंबाई बनाये रख सकता है और उसके बाद कुछ इस तरह करते हैं:

array[arraylen++] = $0; 

और फिर तत्वों यह एक ही पूर्णांक मूल्यों के माध्यम से पहुंच:

for (i = 0; i < arraylen; i++) 
    print array[i]; 
+0

+1 - GAWK में 'लंबाई()' फ़ंक्शन एक सरणी में तत्वों की संख्या वापस कर देगा, लेकिन चूंकि सरणी स्पैस हैं, इसलिए लंबाई आवश्यक तत्व नहीं है। –

+1

सिर्फ ऐतिहासिक संदर्भ के लिए, 'लंबाई (सरणीनाम) 'नोटेशन GAWK के लिए विशिष्ट नहीं है। यह [जोड़ा गया] (https://github.com/onetrueawk/awk/blob/master/FIXES#L322) 2002 में एक ट्रू अवेक में था। ऐसा हो सकता है कि यह कार्यक्षमता गॉक [तीन साल बाद] (http: //code.metager.de/source/xref/gnu/gawk/ChangeLog.0#3453)। – ghoti

6

gawk में आप एक सरणी की लंबाई पा सकते हैं length(var) के साथ, इसलिए अपने स्वयं के फ़ंक्शन को पकाएं बहुत मुश्किल नहीं है।

function push(A,B) { A[length(A)+1] = B } 

सूचना इस चर्चा है, हालांकि: http://objectmix.com/awk/361598-gawk-length-array-question.html - सभी स्थानों मैं अभी तक पहुँच सकते हैं gawk 3.1.5 तो मैं ठीक से ओह मेरी समारोह परीक्षण नहीं कर सकते, है। लेकिन यहां एक अनुमान है।

vnix$ gawk '# BEGIN: make sure arr is an array 
> BEGIN { delete arr[0] } 
> { print "=" length(arr); arr[length(arr)+1] = $1; 
>  print length(arr), arr[length(arr)] } 
> END { print "---"; 
>  for (i=1; i<=length(arr); ++i) print i, arr[i] }' <<HERE 
> fnord foo 
> ick bar 
> baz quux 
> HERE 
=0 
1 fnord 
=1 
2 ick 
=2 
3 baz 
--- 
1 fnord 
2 ick 
3 baz 
+1

'ए [लंबाई (ए) +1] 'स्निपेट टकराव से बचने के लिए गारंटी नहीं है। यह आपके उदाहरण की तरह मामलों में काम करता है, जहां आप केवल अनुमानित क्रम में सरणी में चीजें जोड़ते हैं। यदि, हालांकि, आप सरणी तत्वों को हटाना चाहते थे, तो आप अंतराल को छोड़कर 'लंबाई()' को कम करते हुए अंतराल बनाते थे। – ghoti

1

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

$ 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 
संबंधित मुद्दे

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