2014-05-24 8 views
8

Ich habe ein varsValues.txtAlternative zu Readarray, weil es nicht auf Mac OS funktioniert x

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

-Datei und ich möchte 2 Arrays erstellen, VARs und Werte. Es sollte enthalten

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

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

I

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 

verwenden, aber ich würde es ohne Readarray möchte, die nicht auf Mac funktioniert (OS X) und IFS (Zwischenfeldtrenner).

Jede andere Lösung? awk? Perl? was ich in meinem Bash-Skript verwenden kann.

Danke.

+1

Was versuchen Sie zu tun? Veröffentlichen Sie eine erwartete Ausgabe. Angesichts Ihrer Eingabe gibt es eine ausgezeichnete Chance, dass Sie nur ein awk-Skript schreiben, kein Shell-Skript, aber wir können Ihnen nicht helfen, bis wir wissen, was es tun soll. –

Antwort

2

Hier ist die awk-Version. Beachten Sie, dass NPars nicht fest codiert ist.

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 

oder durch das Lesen zweimal derselben Datei,

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

Und was dann? Diese füllt keine Shell-Variablen wie das Beispielskript. – msw

1

können Sie declare Bulletin verwenden:

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

Es sollte ohne das 'declare' funktionieren, nur:' vars = ($ (cut -d '=' -f1 varsValues.txt)) 'funktioniert gut auf meinem Ubuntu. – Jotne

+0

Das ist richtig, es sollte funktionieren, ohne auch '-a' zu deklarieren. – anubhava

3

Sie eine Leseschleife nutzen könnten.

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

+1 Dies wäre auch dann vorzuziehen, wenn 'readarray' * * verfügbar wäre, da es externe Prozesse und ein zweites Durchlaufen der Datei vermeidet. – chepner

1

Beginnen wir mit dieser beginnen:

$ 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 

jetzt - was braucht man sonst noch zu tun?