2014-05-24 4 views
8

पर काम नहीं करता मैं एक varsValues.txt फ़ाइलविकल्प है, क्योंकि यह मैक ओएस एक्स

cat varsValues.txt 
aa=13.7 
something=20.6 
countries=205 
world=1 
languages=2014 
people=7.2 
oceans=3.4 

है और मैं 2 सरणियों बनाना चाहेंगे, वार्स और मूल्यों। यह शामिल करना चाहिए

echo ${vars[@]} 
aa something countries world languages people oceans 

echo ${values[@]} 
13.7 20.6 205 1 2014 7.2 3.4 

मैं उपयोग

Npars=7 

readarray -t vars < <(cut -d '=' -f1 varsValues.txt) 
readarray -t values < <(cut -d '=' -f2 varsValues.txt) 

for ((yy=0; yy<$Npars; yy++)); do 
eval ${vars[$yy]}=${values[$yy]} 
done 

echo $people 
7.2 

लेकिन मैं readarray बिना यह चाहते हैं जो मैक (ओएस एक्स) और भारतीय विदेश सेवा (interfield separater) पर काम नहीं करता।

कोई अन्य समाधान? awk? पर्ल? जिसे मैं अपनी बैश स्क्रिप्ट में उपयोग कर सकता हूं।

धन्यवाद।

declare -a vars=($(cut -d '=' -f1 varsValues.txt)) 
declare -a values=($(cut -d '=' -f2 varsValues.txt)) 
+1

आप क्या करने की कोशिश कर रहे हैं? कुछ अपेक्षित आउटपुट पोस्ट करें। आपके इनपुट को देखते हुए, एक शानदार मौका है कि आपको सिर्फ एक स्क्रिप्ट स्क्रिप्ट नहीं, बल्कि एक स्क्रिप्ट स्क्रिप्ट लिखना चाहिए, लेकिन हम तब तक आपकी मदद नहीं कर सकते जब तक कि हम नहीं जानते कि यह क्या करना है। –

उत्तर

2

यहां अजीब संस्करण है। ध्यान दें कि NPars हार्डकोड नहीं है।

vars=($(awk -F= '{print $1}' varsValues.txt)) 
values=($(awk -F= '{print $2}' varsValues.txt)) 

Npars=${#vars[@]} 

for ((i=0; i<$Npars; i++)); do 
    eval ${vars[$i]}=${values[$i]} 
done 

echo $people 
1
perl -0777 -nE '@F= split /[=\r\n]/; say "@F[grep !($_%2), 0..$#F]"; say "@F[grep $_%2, 0..$#F]"' varsValues.txt 

या एक ही फाइल दो बार पढ़ कर,

perl -F'=' -lane 'print $F[0]' varsValues.txt 
perl -F'=' -lane 'print $F[1]' varsValues.txt 
+0

और फिर क्या? नमूना स्क्रिप्ट के रूप में ये शैल चर को पॉप्युलेट नहीं करते हैं। – msw

1

आप declare बुलेटिन उपयोग कर सकते हैं।

while IFS=\= read var value; do 
    vars+=($var) 
    values+=($value) 
done < VarsValues.txt 
+0

इसे 'घोषित' के बिना काम करना चाहिए, बस: 'vars = ($ (cut -d' = '-f1 varsValues.txt))' मेरे उबंटू पर ठीक काम करें। – Jotne

+0

यह सही है कि इसे 'declare -a' के बिना भी काम करना चाहिए। – anubhava

3

आप पढ़ने पाश इस्तेमाल कर सकते हैं:

+0

+1 यह तब भी पसंद किया जाएगा जब 'readarray' * उपलब्ध थे, क्योंकि यह बाहरी प्रक्रियाओं से बचाता है और फ़ाइल के माध्यम से दूसरा पास होता है। – chepner

1

के इस साथ शुरू करते हैं:

$ awk -F'=' '{values[$1]=$2} END{print values["people"]}' file 
7.2 

$ awk -F'=' '{values[$1]=$2} END{for (name in values) print name, values[name]}' file 
languages 2014 
oceans 3.4 
world 1 
something 20.6 
countries 205 
people 7.2 
aa 13.7 

अब - और क्या आप क्या करना चाहिए?