2014-05-24 11 views
8

mam varsValues.txt złożyćalternatywą readarray, ponieważ nie działa na Mac OS X

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

I chciałbym utworzyć 2 tablice, Vars i wartości. Powinna ona zawierać

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

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

używam

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 

Ale chciałbym go bez readarray który nie działa na Mac (OS X) oraz IFS (pomiędzy polami separater).

Jakieś inne rozwiązanie? awk? perl? które mogę użyć w moim skrypcie basha.

Dzięki.

+1

Co próbujesz zrobić? Opublikuj oczekiwane wyniki. Biorąc pod uwagę twój wkład, istnieje doskonała szansa, że ​​powinieneś po prostu napisać skrypt awk, a nie skrypt powłoki, ale nie możemy ci z tym pomóc, dopóki nie dowiemy się, co powinien zrobić. –

Odpowiedz

2

Oto wersja awk. Zauważ, że NPars nie jest na stałe zakodowany.

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 

lub poprzez czytanie tego samego pliku dwa razy,

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

A co potem? Nie wypełniają one zmiennych powłoki, jak robi to przykładowy skrypt. – msw

1

Można użyć declare ogłoszeń:

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

Powinno działać bez 'declare', just:' vars = ($ (cut -d '=' -f1 varsValues.txt)) "działa dobrze na moim Ubuntu. – Jotne

+0

To prawda, że ​​powinien działać także bez 'declare -a'. – anubhava

3

Można użyć pętli odczytu.

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

+1 Byłoby to preferowane, nawet jeśli 'readarray' * był * dostępny, ponieważ unika zewnętrznych procesów i drugiego przejścia przez plik. – chepner

1

Zacznijmy od tego:

$ 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 

Teraz - co jeszcze trzeba zrobić?