Разделение строки, разделенной запятой, на значения массива в сценарии оболочки?

#arrays #string #shell #unix #awk

#массивы #строка #оболочка #unix #awk

Вопрос:

Мой набор данных (data.txt ) выглядит следующим образом [ImageID,SessionID,height1,height2,x,y,обрезка]:

 1,0c66824bfbba50ee715658c4e1aeacf6fda7e7ff,1296,4234,194,1536,0
2,0c66824bfbba50ee715658c4e1aeacf6fda7e7ff,1296,4234,194,1536,0
3,0c66824bfbba50ee715658c4e1aeacf6fda7e7ff,1296,4234,194,1536,0
4,0c66824bfbba50ee715658c4e1aeacf6fda7e7ff,1296,4234,194,1536,950
  

Это набор значений, которые я хочу использовать. Я новичок в сценарии оболочки 🙂 Я читаю файл построчно следующим образом ,

 cat $FILENAME | while read LINE
do
string=($LINE)
# PROCESSING THE STRING
done
  

Теперь, в приведенном выше коде, после получения строки, я хочу сделать следующее :
1. Разделите строку на значения, разделенные запятыми.
2. Сохраните эти переменные в массивах, таких как ImageID[], SessionID[] .

Мне нужно получить доступ к этим значениям для обработки изображений с помощью imagemagick. Однако я не могу правильно выполнить вышеуказанные шаги

Ответ №1:

set -A у меня не работает (вероятно, из-за более старого BASH на OSX)

Публикация альтернативного решения с использованием read -a на случай, если оно кому-то понадобится:

 # init all your individual arrays here
imageId=(); sessionId=();

while IFS=, read -ra arr; do
    imageId =(${arr[0]})
    sessionId =(${arr[1]})
done < input.csv

# Print your arrays
echo "${imageId[@]}"
echo "${sessionId[@]}"
  

Комментарии:

1. Аккуратное решение, удовлетворяющее большинству моих требований! Большое спасибо!

2. Не могли бы вы создать заголовок цикла while IFS=, read -ra arr; do и избавиться от следующей строки?

3. Кажется, что строка инициализации imageId=(); sessionId=(); также не нужна. (Хотя это не повредит!)

Ответ №2:

 oIFS="$IFS"; IFS=',' 
set -A str $string
IFS="$oIFS"

echo "${str[0]}";
echo "${str[1]}";
echo "${str[2]}";
  

вы можете разделить и сохранить следующим образом

посмотрите здесь, чтобы узнать больше о массивах Unix.

Комментарии:

1. Хорошо, итак, вы разделяете строку и сохраняете их в массиве. Как мне сохранить объекты в разных массивах. Я хочу создать массивы ImageID, SessionID и т. Д. Не могли бы вы, пожалуйста, изменить свой код?

2. Большое спасибо за помощь!

3. set -A у меня не работает (нет -A возможности set ). Страница, на которую вы ссылаетесь, использует declare .