Преобразование файла в 2d массив в bash - PullRequest
2 голосов
/ 13 марта 2019

Я работаю над проектом, в котором я сохранил некоторые данные в файл (data.txt).

10010101010;99;18767654536;252525
89878337326;44;18764329087;242424

Следующим шагом теперь является считывание этих данных в двумерный массив, где строка [0] - это первая строка, а строка [1] - вторая строка. Я пытаюсь достичь этой цели. Кроме того, я хотел бы иметь возможность получить доступ к отдельным элементам для каждой строки также

У меня есть этот код, но он печатает только первую строку, и я не могу получить доступ к элементам

read -a rows < data.txt                                          
for row in "${rows[@]}";do                                                      
  row_array=(${row})                                                            
  first=${row_array[0]} 
  sec=${row_array[1]}                                                        
  echo ${first}
  echo ${sec}                                                                 
done

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Вы можете установить переменную внутренний разделитель полей (IFS) . Внутренний разделитель полей (сокращенно IFS) относится к переменной, которая определяет символ или символы, используемые для разделения шаблона на токены для некоторых операций. Он проанализирует одну строку элементов, разделенных ;, и поместит ее в массив DATA.

#!/bin/bash
while IFS=\; read -ra DATA; do
  for i in "${DATA[@]}"; do
    echo -e "$i"
  done
  echo
done

Пример сценария выдаст следующий вывод:

10010101010
99
18767654536
252525

89878337326
44
18764329087
242424

3 голосов
/ 13 марта 2019

После вашего комментария выглядит, что вам нужен простой цикл while read:

while IFS=';' read -r id rest; do
    if [[ "$id" == "10010101010" ]]; then
        echo "Matching line : $id $rest"
    fi
done < data.txt

В этом коде IFS=';' указывает на использование символа ; в качестве внутреннего разделителя полей длякоманда read, которая заставит ее проанализировать каждую из ваших строк как четыре разных слова.

Имена, следующие за read -r, соответствуют переменным, используемым для хранения каждого из этих слов, последнее из которых содержитостальная часть строки, если слов больше, чем переменных.
read -r id rest сохранит первый столбец в переменной $id, а оставшиеся слова - в $rest, тогда как read -r first second third fourth будет хранить каждое слово в своем собственномпеременная.

Ввод команды read указывается в конце цикла while, добавляя < data.txt после done закрытия цикла.

...