CodingInCircles
CodingInCircles

Reputation: 2807

Read delimited multiline string file into multiple arrays in Bash

I began with a file like so:

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

I have a script that parses this file and splits them into two arrays:

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

This works really well, with no problems whatsoever.

I wanted to extend this and make the file:

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

For this, I tried:

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

And while this will faithfully list all the Table IDs and the Table descriptions, the schemas are omitted. I tried:

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}"

And it returns just the last line's Table name, description AND schema. I suspect this is an indexing/looping problem, but am unable to figure out what exactly is going wrong. Please help! Thanks!

Upvotes: 0

Views: 45

Answers (1)

karakfa
karakfa

Reputation: 67467

perhaps set the delimiter to the actual delimiter - and do the processing in the read loop instead of deferring and using arrays.

$ while IFS=- read -r t d s; 
  do 
    echo "Creating Table ID: ${t// }, with Table Description: ${d// } and schema: ${s// }";
  done < file

Upvotes: 1

Related Questions