2013-10-10 6 views
1

Я пытаюсь взять файл и сохранить элементы из файла в ассоциативный массив в bash. Ассоциативный массив, возможно, не лучший курс для моего действия, но из моих исследований это, похоже, хорошо подходит. У меня есть файл, который выглядит следующим образом:Ассоциативные массивы в Bash

personid 
phone 
phone 
phone 
personid 
phone 
phone 
phone 

Пожалуйста, обратите внимание, persionid всегда 20 цифр, и телефон не всегда 10. Там нет ничего в этом файле, и никаких пробелов, только один из них в каждой строке , Я хотел сопоставить их с ассоциативным массивом, когда мой ключ был персонифицированным, а моя ценность была телефоном.

кода я работал в отношении этого куска заключается в следующем:

declare -A person 

while read key; do 

    if [ ${#key} -eq 20 ] ; then 
     personID="$key" 
    else 
     phone="$key" 
    fi 

    person=(["$personID"]="$phone") 

done < myFile.txt 

for i in "${!person[@]}" 
do 
    echo "key: $i" 
    echo "value: ${person[$i]}" 
done 

Это будет правильно хранить и печатать одну PersonId в качестве ключа и один телефона в качестве значения .... но там должно быть несколько значений для телефона. Я думаю, когда я назначаю человека, я должен поступать так неправильно или делать это неправильно. Но я играл с ним довольно давно и не могу понять. Никогда раньше не использовались ассоциативные массивы, поэтому у вас были небольшие проблемы. Заранее спасибо за помощь!

+0

Ассоциативные массивы или карты хранения пар ключ-значение. Вы хотите использовать multimap, который позволяет связать несколько значений с одним ключом. Лично я бы переключился на Python, так как скрипт bash становится слишком сложным. – Dennis

+0

Спасибо, Деннис, непонимание ассоциативных массивов с моей стороны – warlord786

+0

Имейте в виду, что 'bash' не предназначен для обработки данных, а для запуска других процессов. – chepner

ответ

1

Ассоциативные массивы не отличаются от любых других массивов тем, что всегда будет отображаться отображение 1: 1 из ключа (или индекса) в значение. В вашем случае вам нужно сопоставить 1: много от ключа (personID) до значений (номеров телефонов). Один из способов сделать это - просто сохранить список телефонных номеров, который фактически является «единственным» значением, сопоставленным с идентификатором personID. Вы можете создать свой список, как вам нравится, с помощью пробелов или разделителей запятой или всего остального.

Например, если вы хотите: в качестве разделителя, вы могли бы сделать это, чтобы добавить каждый номер телефона в списке:

if [ -n ${person[$personID]} ] ; then 
    person[$personID]}="${person[$personID]}:$phone" 
else 
    person[$personID]}="$phone" 
fi 
+0

Ах, ладно, спасибо. Непонимание о ассоциативных массивах с моей стороны :) – warlord786

+1

@ warlord786 - не стоит беспокоиться :) - Вы кое-чему научились от SO сегодня - вот почему все это стоит того! –

Смежные вопросы