2014-05-24 74 views
8

工作,我有一個varsValues.txt文件替代readarray,因爲它沒有在Mac OS X

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

而且我想創建2個陣列,VAR和值。它應該包含

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它無法在Mac(OS X)和IFS(場間分體)工作。

任何其他解決方案? AWK? Perl的?我可以在我的bash腳本中使用它。

謝謝。

+1

你想做什麼?發佈一些預期的輸出。考慮到你的意見,你應該只是寫一個awk腳本而不是shell腳本,但是我們無法幫助你,直到我們知道它應該做什麼爲止。 –

回答

2

這裏是awk版本。請注意,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

然後呢?這些不會像示例腳本那樣填充shell變量。 – msw

1

您可以使用declare公告:

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

它應該沒有'declare',只是:'vars =($(cut -d'='-f1 varsValues.txt))'在我的Ubuntu上正常工作。 – Jotne

+0

這是正確的,它應該沒有'declare -a'也工作。 – anubhava

3

你可以使用一個讀循環。

while IFS=\= read var value; do 
    vars+=($var) 
    values+=($value) 
done < VarsValues.txt 
+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 

現在 - 還有什麼你需要做什麼?