2014-10-29 6 views
6

चलो कहते हैं कि मैं कौन इस तरह उस में एक मेज है 'demo.txt' एक पाठ फ़ाइल करते हैं:बैश में 'readarray' का उपयोग कैसे करें एक 2D सरणी में एक फ़ाइल से लाइनों को पढ़ने के लिए

1 2 3  
4 5 6  
7 8 9  

अब , मैं प्रत्येक पंक्ति अलग बैश में 'readarray' आदेश का उपयोग पढ़ना चाहते हैं, तो मैं लिखना:

readarray myarray < demo.txt 

समस्या यह है कि यह काम नहीं करता है। अगर मैं के साथ 'myArray' मुद्रित करने के लिए प्रयास करें:

echo $myarray 

मैं:

1 2 3 

इसके अलावा, अगर मैं लिखने:

echo ${myarray[1]} 

मैं:

4 5 6 

इसके बजाय:

2 

जैसा कि मैंने अपेक्षा की थी। ऐसा क्यों है? प्रत्येक पंक्ति को अलग-अलग कैसे एक्सेस किया जा सकता है और उस पंक्ति में प्रत्येक सदस्य तक पहुंच प्राप्त हो सकती है?

उत्तर

9

यह अपेक्षित व्यवहार है। readarray एक सरणी बनाएगा जहां सरणी का प्रत्येक तत्व इनपुट में एक पंक्ति है।

आप पूरे सरणी आप

echo "${myarray[@]}" 

रूप echo "$myarray केवल उत्पादन होगा myarray[0] उपयोग करने की आवश्यकता देखना चाहते हैं, और ${myarray[1]} डेटा की दूसरी पंक्ति है।

जो आप खोज रहे हैं वह एक द्वि-आयामी सरणी है। उदाहरण के लिए देखें this

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

$ read -a arr < demo.txt 
$ echo ${arr[0]} 
1 
$ echo ${arr[1]} 
2 
$ echo ${arr[2]} 
3 
+0

हाय डेमियन, सबसे पहले, त्वरित जवाब के लिए धन्यवाद। दूसरा, मैं देख सकता हूं कि आप क्या कह रहे हैं, मैं नहीं देख सकता कि मैं इसे पढ़ने के तरीके को कैसे पढ़ सकता हूं? पहली पंक्ति से सदस्यों के साथ सरणी कैसे प्राप्त कर सकते हैं: 1, 2, 3? – user3206874

+0

हाय डेमियन, फिर, उत्तर के लिए धन्यवाद। मैंने इसका उपयोग करने का अपना तरीका आजमाया: read -a arr user3206874

1

डेमियन के जवाब पर विस्तार करने के लिए (और क्योंकि मैं टिप्पणी नहीं अभी तक प्रस्तुत नहीं कर सकते हैं ...) आप बस पढ़ने पर फिर से शुरू करें। क्या मेरा मतलब है निम्नलिखित

exec 5<demo.txt 
for i in `seq 1 ${numOfLinesInFile}` 
do 
read -a arr -u 5 
    for j in `seq 0 ${numOfColumnsMinus1}` 
    do 
    echo ${arr[$j]} 
    done 
done 

मुझे आशा है कि आप पहले से ही एक समाधान पाया (टक्कर करने के लिए माफी ...) की तरह कुछ है। एक दोस्त को सिखाने में मदद करते हुए मैंने इस पृष्ठ पर ठोकर खाई और लगा कि दूसरों को भी ऐसा ही हो सकता है।

1

प्रत्येक पंक्ति को अलग-अलग कैसे एक्सेस किया जा सकता है और उस पंक्ति में प्रत्येक सदस्य तक पहुंच प्राप्त हो सकती है?

Bash Reference Manual पर, बैश एक-आयामी अनुक्रमित और सहयोगी सरणी चर प्रदान करता है। तो आप matrix[1][2] या काम के समान होने की उम्मीद नहीं कर सकते हैं। हालांकि, आप emulate बैश सहयोगी सरणी का उपयोग करके मैट्रिक्स एक्सेस कर सकते हैं, जहां कुंजी एकाधिक आयाम को दर्शाती है।

उदाहरण के लिए, matrix[1,2] स्ट्रिंग "1,2" स्ट्रिंग का उपयोग करता है जो पहली पंक्ति, 2 कॉलम को इंगित करने वाली एसोसिएटिव सरणी कुंजी के रूप में होता है। readarray के साथ इस संयोजन:

typeset -A matrix 
function load() { 
    declare -a a=($2) 
    for ((c=0; c < ${#a[@]}; c++)) 
    do 
     matrix[$1,$c]=${a[$c]} 
    done 
} 
readarray -C load -c 1 <<< $'1 2 3\n4 5 6\n7 8 9' 
declare -p matrix 
0

क्षमा टक्कर के लिए, लेकिन मेरा मानना ​​है कि वहाँ आपके अनुरोध के लिए एक आसान और बहुत साफ समाधान:

$ cat demo.txt 
1 2 3 
4 5 6 
7 8 9 
$ while read line;do IFS=' ' myarray+=(${line}); done < demo.txt 
$ declare -p myarray 
declare -a myarray='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9")' 
$ 
2
readarray rows < demo.txt           

for row in "${rows[@]}";do              
    row_array=(${row})                
    first=${row_array[0]}               
    echo ${first}                 
done 
संबंधित मुद्दे