2014-05-03 7 views
10

पर बैश पढ़ने से मैं एक एसोसिएटिव सरणी का उपयोग करके बैश में एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं।एक फाइल से एक सहयोगी सरणी

a,b,c,d,e,f 
g,h,i,j,k,l 

निम्न स्क्रिप्ट:

a b ---> c d e f 

g h ---> i j k l 

उत्तर

15
:

oldIFS=${IFS} 
IFS="," 

declare -A assoc 
while read -a array 
do 
    assoc["${array[0]}"]="${array[@]" 
done 

for key in ${!assoc[@]} 
do 
    echo "${key} ---> ${assoc[${key}]}" 
done 

IFS=${oldIFS} 

मुझे

a ---> a b c d e f 

g ---> g h i j k l 

मैं अपने उत्पादन की जरूरत होने के लिए देता है मैं एक फ़ाइल data कहा जाता है

डेटा:

a,b,c,d,e,f 
g,h,i,j,k,l 

आउटपुट:

a b ---> c d e f 
g h ---> i j k l 

Substring Expansion यहाँ का उपयोग करता है ${array[@]:2} पाने के लिए assoc सरणी के मूल्य के रूप में की जरूरत सबस्ट्रिंग। बैकस्लैश को बचने वाले चरित्र के रूप में कार्य करने से रोकने के लिए -rread भी जोड़ा गया।

@ gniourf_gniourf के सुझावों के आधार पर सुधार: `read` आदेश के लिए, 1. रखें` आईएफएस = `और नहीं बचत` IFS` और यह बहाल बेला के लिए:

declare -A assoc 
while IFS=, read -r -a array 
do 
    ((${#array[@]} >= 2)) || continue 
    assoc["${array[@]:0:2}"]="${array[@]:2}" 
done < data 

for key in "${!assoc[@]}" 
do 
    echo "${key} ---> ${assoc[${key}]}" 
done 
+5

आप कुछ सुधार जोड़ सकता है । 2. लूप में 'जोड़ें (($ {# सरणी [@]}> = 2)) || जारी रखें 'या कुछ खाली लाइनों से छुटकारा पाने के समान। 3. अपना असाइनमेंट 'assoc ["$ {array [@] :: 2}"] = $ {array [@]: 2} 'के रूप में लिखें। –

+0

@gniourf_gniourf, '$ {सरणी [@] :: 2}' '{{पैरामीटर: ऑफसेट: लंबाई} 'के रूप में' ओमेटेड 'ऑफसेट' के साथ 'और' ऑफसेट' शून्य माना जाता है? – Ashkan

+0

हाँ, यह सही है! –

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