2015-06-16 2 views
2

Я пытаюсь прочитать из файла данные, которые он содержит, и получить 2 важных фрагмента данных из файла и использовать его в сценарии bash. Строка, а затем номер, например:Хранение нескольких столбцов данных из файла в переменной

Box 12 
Toy 85 
Dog 13 
Bottle 22 

Я думал, что я мог бы написать while петлю в петлю через файл и сохранить данные в переменной. Однако мне нужны две разные переменные: одна для числа и одна для слова. Как их разделить на две переменные?

+1

http://mywiki.wooledge.org/BashFAQ/001 –

+0

@Jahid, я отмечаю, что вы отбросили дескриптор «ключ/значение». У вас есть лучший способ сделать заголовок вопроса описанием того, что мы хотим читать более одного столбца за раз? Если у него нет каких-либо ограничений для этого эффекта («несколько столбцов данных», может быть?), Он дублирует многие, многие ранее существовавшие вопросы и не делает различий четко для людей, которые пытаются найти вопрос что соответствует тому, что они пытаются сделать. –

+0

@CharlesDuffy Ну, ОП не сказал, что ему нужны данные типа ключа/значения, это причина отката назад, и да, его нужно отредактировать, чтобы быть более конкретным ... может быть «хранение данных, разделенных пробелом ...» – Jahid

ответ

1

Пример кода:

#!/bin/bash 
declare -a textarr numarr 
while read -r text num;do 
textarr+=("$text") 
numarr+=("$num") 
done <file 
echo ${textarr[1]} ${numarr[1]} #will print Toy 85 

данные хранятся в двух переменных массива: textarrnumarr. Вы можете получить доступ к каждому из них с помощью индекса ${textarr[$index]} или все из них сразу с ${textarr[@]}

+1

Недостатком этой схемы (по сравнению с ассоциативным массивом) является то, что относительно сложно найти индекс, который содержит «Собака», и оттуда найти, что число равно 13. С другой стороны вы все равно можете ответить на вопрос «если число равно 13, что такое имя», которое относительно сложно с ассоциативным массивом. –

2

Чтобы прочитать все данные в единый ассоциативный массив (в Баше 4.0 или более поздней версии):

#!/bin/bash 
declare -A data=() 
while read -r key value; do 
    data[$key]=$value 
done <file 

С этим сделано, можно получить значение по ключу эффективно:

echo "${data[Box]}" 

... или перебрать все ключи:

for key in "${!data[@]}"; do 
    value=${data[$key]} 
    echo "Key $key has value $value" 
done 

Отметим, что read принимает несколько имен в списке своих аргументов. Если задано несколько аргументов, он разбивает поля на IFS, помещая столбцы в соответствующие переменные (при этом вся остальная часть строки переходит в последнюю переменную с именем, если указано больше столбцов, чем имена переменных).

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