2010-06-17 13 views
13

Awk सरणी प्रसंस्करण के लिए सहयोगी अनुक्रमण प्रदान करता है। 1 आयामी सरणी के तत्वों को पुनरावृत्त किया जा सकता है:बहु-आयामी सरणी के लिए Awk सरणी पुनरावृत्ति

उदा।

for(index in arr1) 
    print "arr1[" index "]=" arr1[index] 

लेकिन यह दो आयामी सरणी के लिए कैसे किया जाता है? क्या नीचे दिए गए वाक्यविन्यास का काम करता है?

for(index1 in arr2) 
for(index2 in arr2) 
    arr2[index1,index2]  
+0

'v4 के रूप में gawk' सरणियों का समर्थन करता है तत्वों नेस्ट सरणियों बहुआयामी सरणियों से, और अधिक लचीला यानी के रूप में,' (i arr2 में) के लिए (जे arr2 [i] में) प्रिंट arr2 [मैं] [जे] ', देखें [जेजोओ का जवाब] (http://stackoverflow.com/a/35891319/1290731) – jthill

उत्तर

29

एडब्ल्यूके एसयूबीएसईपी चर (0x1c) में वर्णित चरित्र के साथ सूचकांक को जोड़कर बहुआयामी सरणी बनाता है। (info gawk फ़ाइल में एक उदाहरण के आधार पर) आप split इस तरह का उपयोग कर एक दो आयामी सरणी के माध्यम से पुनरावृति कर सकते हैं:

awk 'BEGIN { OFS=","; array[1,2]=3; array[2,3]=5; array[3,4]=8; 
    for (comb in array) {split(comb,sep,SUBSEP); 
    print sep[1], sep[2], array[sep[1],sep[2]]}}' 

आउटपुट:

2,3,5 
3,4,8 
1,2,3 

हालांकि, आप से अधिक पुनरावृति कर सकते हैं एक संख्यानुसार अनुक्रमित सरणी छोरों के लिए नेस्ट का उपयोग:

for (i = 1; i <= width; i++) 
    for (j = 1; j < = height; j++) 
     print array[i, j] 

से GAWK manual जानकारी का एक और उल्लेखनीय बिट:

यह जांचने के लिए कि एक बहुआयामी सरणी में कोई विशेष अनुक्रमणिका अनुक्रम मौजूद है या नहीं, उसी ऑपरेटर (इन) का उपयोग करें जो एकल आयामी सरणी के लिए उपयोग किया जाता है। कोष्ठक में सूचकांक अल्पविराम के द्वारा अलग की पूरी अनुक्रम लिखें, बाईं संकार्य के रूप में:

 (subscript1, subscript2, ...) in array 
5

नहीं है, वाक्य रचना

for(index1 in arr2) for(index2 in arr2) { 
    print arr2[index1][index2]; 
} 

काम नहीं करेगा। Awk वास्तव में बहु आयामी सरणी का समर्थन नहीं करता है। यह क्या करता है, अगर आप की तरह

x[1,2] = 5; 

कुछ करना एक स्ट्रिंग, SUBSEP चर के मूल्य के द्वारा अलग बनाने के लिए एक के इंडेक्स (1 & 2) जोड़ रहा है। यदि यह "*" के बराबर है, तो आप एक ही प्रभाव

x["1*2"] = 5; 

रूप SUBSEP का डिफ़ॉल्ट मान, एक गैर मुद्रण चरित्र है Ctrl + करने के लिए इसी \ होगा। एक बहु-आयामी सरणी पुनरावृति करने के लिए कैसे - - बस एक ही for(a in b) पाश का उपयोग

% awk -f scriptfile | cat -v 
1^\2 
2^\4 

तो, आपके सवाल का जवाब में:

BEGIN { 
    x[1,2]=5; 
    x[2,4]=7; 
    for (ix in x) { 
     print ix; 
    } 
} 

चल रहा है इस देता है: आप निम्न स्क्रिप्ट के साथ इस को देख सकते हैं , लेकिन आपको a को x और y भागों में विभाजित करने के लिए कुछ अतिरिक्त कार्य की आवश्यकता हो सकती है।

3

के वर्तमान संस्करण लिनक्स में (जीएनयू awk, डिफ़ॉल्ट घूर रहा, और संभव आप हर जगह स्थापित करने के लिए चाहते हैं), असली बहुआयामी सरणी है।

for(b in a) 
    for(c in a[b]) 
     print a[b][c], c , b 

भी देखें isarray()

1

ढंग से काम मुझे लगता है मैं कैसे अपने काम प्रसंस्करण क्वेरी डेटा में इस का उपयोग का एक उदाहरण प्रदान करेंगे। मान लीजिए आप एक उद्धरण उत्पाद श्रेणी और ग्राहक आईडी से लेन-देन का पूरा फ़ाइल है:

customer_id category sales 
1111   parts  100.01 
1212   parts  5.20 
2211   screws  1.33 
...etc... 

यह एक खरीद के साथ कुल अलग ग्राहकों गिनती करने के लिए awk का उपयोग करने के लिए आसान:

awk 'NR>1 {a[$1]++} END {for (i in a) total++; print "customers: " total}' \ 
datafile.txt 

हालांकि, की संख्या परिकलित प्रत्येक श्रेणी में एक खरीद के साथ अलग ग्राहकों को एक दो आयामी सरणी पता चलता है:

awk 'NR>1 {a[$2,$1]++} 
     END {for (i in a) {split(i,arr,SUBSEP); custs[arr[1]]++} 
      for (k in custs) printf "category: %s customers:%d\n", k, custs[k]}' \ 
datafile.txt 

custs[arr[1]]++ कार्यों की वेतन वृद्धि क्योंकि प्रत्येक श्रेणी/custo mer_id जोड़ी अजीब द्वारा उपयोग किए जाने वाले सहयोगी सरणी के लिए एक सूचकांक के रूप में अद्वितीय है।

सच में, मैं gnu awk का उपयोग करता हूं जो तेज़ है और array[i][j] कर सकता है क्योंकि डी विलियम्सन ने उल्लेख किया था। लेकिन मैं यह सुनिश्चित करना चाहता था कि मैं इसे मानक अजीब में कर सकता हूं।

1

awk (1) मूल रूप से डिजाइन किया गया था - भाग में - सी भाषा के लिए शिक्षण उपकरण होने के लिए, और बहु-आयामी सरणी सी और अजीब (1) दोनों में हमेशा के लिए बहुत अधिक रही हैं। क्योंकि इस तरह के पॉज़िक्स आईईईई 1003.2 ने उन्हें मानकीकृत किया।

BEGIN { 
    KEY["a"]="a"; 
    KEY["b"]="b"; 
    KEY["c"]="c"; 
    MULTI["a"]["test_a"]="date a"; 
    MULTI["b"]["test_b"]="dbte b"; 
    MULTI["c"]["test_c"]="dcte c"; 
} 
END { 
    for(k in KEY) { 
    kk="test_" k ; 
    print MULTI[k][kk] 
    } 
    for(q in MULTI) { 
    print q 
    } 
    for(p in MULTI) { 
    for(pp in MULTI[p]) { 
     print MULTI[p][pp] 
    } 
    } 
} 

और यह इस आदेश के साथ चलाएँ::

awk -f test.awk /dev/null 

आप मिल जाएगा निम्नलिखित यदि आप "test.awk" कहा जाता है निम्नलिखित फ़ाइल बनाने

, वाक्य रचना और शब्दों को एक्सप्लोर करने के लिए उत्पादन:

date a 
dbte b 
dcte c 
a 
b 
c 
date a 
dbte b 
dcte c 

कम से कम लिनक्स पर टकसाल 18 दालचीनी 64-बिट 4.4.0-21-जेनेरिक # 37-उबंटू SMP

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