Массивы Bash: нужна помощь с пробелами - PullRequest
3 голосов
/ 13 января 2010

Я пытаюсь создать массив в bash из файла в следующем формате:

data, data, interesting
data, data, more interesting

То, как я заполняю массивы:

read -r -a DATA1 <<< $(cat $FILE | awk -F, '{ print $1 }')
read -r -a DATA2 <<< $(cat $FILE | awk -F, '{ print $2 }')
read -r -a DATA3 <<< $(cat $FILE | awk -F, '{ print $3 }')

Когда я проверяю массив DATA3, есть 3 элемента:

interesting
more
interesting

Мне нужно, чтобы отображались только 2 элемента, например:

interesting
more interesting

Как сохранить пробел в поле 3, чтобы при вызове этого элемента из массива он отображался как «более интересный»? Есть ли лучший способ справиться с этим?

Ответы [ 4 ]

3 голосов
/ 13 января 2010

Ключ должен использовать переменную IFS (внутренние разделители полей) вместе с read.

read может читать слова непосредственно в массив, используя опцию -a.Установите IFS=,, и он будет разделен запятой:

while read f; do
    echo "$f" | (IFS=, && read -a arr && echo ${arr[2]})
done

будет отображаться эхо

interesting
 more interesting 

Вы также можете непосредственно читать имена переменных:

IFS=, && read f1 f2 f2

РЕДАКТИРОВАТЬ: Я могу порекомендовать прочитать Руководство по расширенному написанию сценариев Bash .

1 голос
/ 13 января 2010
IFS=','
while read -a array
do
    echo "${array[2]}" 
done < data.csv
1 голос
/ 13 января 2010

Используйте cut. Пример:

read -r -a DATA1 <<< $(cut -d, -f 1 $FILE)
read -r -a DATA2 <<< $(cut -d, -f 2 $FILE)
read -r -a DATA3 <<< $(cut -d, -f 3 $FILE)
0 голосов
/ 13 января 2010
>> Is there a better way to handle this? - Tee Bone

$ awk -F", " '{print $3}' file
interesting
more interesting
...