Читать многострочный файл с разделителями в несколько массивов в Bash - PullRequest
0 голосов
/ 25 сентября 2018

Я начал с файла, подобного так:

Table_name1 - Table_desc1
Table_name2 - Table_desc2
...
...

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

declare -a TABLE_IDS=()
declare -a TABLE_DESCS=()

while IFS= read -r line || [[ -n "${line}" ]]; do
  TABLE_IDS[i]=${line%' '-' '*}
  TABLE_DESCS[i++]=${line#*' '-' '}
done < "${TABLE_LIST}"

for i in "${!TABLE_IDS[@]}"; do
        echo "Creating Table ID: "${TABLE_IDS[i]}", with Table Description: "${TABLE_DESCS[i]}""
done

Это работает очень хорошо, сникаких проблем вообще.

Я хотел бы расширить это и сделать файл:

Table_name1 - Table_desc1 - Table_schema1
Table_name2 - Table_desc2 - Table_schema2
...
...

Для этого я попытался:

declare -a TABLE_IDS=()
declare -a TABLE_DESCS=()

while IFS= read -r line || [[ -n "${line}" ]]; do
  TABLE_IDS[i]="$(echo $line | cut -f1 -d - | tr -d ' ')"
  TABLE_DESCS[i++]="$(echo $line | cut -f2 -d - | tr -d ' ')"
  TABLE_SCHEMAS[i++]="$(echo $line | cut -f3 -d - | tr -d ' ')"
done < "${TABLE_LIST}"

for i in "${!TABLE_IDS[@]}"; do
        echo "Creating Table ID: "${TABLE_IDS[i]}", with Table Description: "${TABLE_DESCS[i]}" and schema: "${TABLE_SCHEMAS[i]}""
done

И хотя при этом будут точно перечислены все идентификаторы таблицыи в таблице описания схемы опущены.Я попытался:

while IFS= read -r line || [[ -n "${line}" ]]; do
  TABLE_IDS[i]="$(echo $line | cut -f1 -d - | tr -d ' ')"
  TABLE_DESCS[i]="$(echo $line | cut -f2 -d - | tr -d ' ')"
  TABLE_SCHEMAS[i]="$(echo $line | cut -f3 -d - | tr -d ' ')"
done < "${TABLE_LIST}"

И он возвращает только имя таблицы, описание И схему последней строки.Я подозреваю, что это проблема индексации / зацикливания, но я не могу понять, что именно происходит не так.Пожалуйста помоги!Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

возможно, установите разделитель на фактический разделитель - и выполните обработку в цикле чтения вместо отсрочки и использования массивов.

$ while IFS=- read -r t d s; 
  do 
    echo "Creating Table ID: ${t// }, with Table Description: ${d// } and schema: ${s// }";
  done < file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...