Считать файл конфигурации в 2D массив - PullRequest
0 голосов
/ 08 октября 2019

У меня есть файл конфигурации:

map_a 1234,3788,9940
map_b 9948,8901
map_c
map_d 7789,30400
map_e 499423
map_f 

Переменная массива должна содержать:

Name    Attribute 1     Attribute 2     Attribute 3     Attribute ...
---------------------------------------------------------------------------
map_a   1234            3788            9940            
map_b   9948            8901    
map_c   
map_d   7789            30400
map_e   499423      
map_f
...

Итак:

 foo[0,0] = map_a
 foo[0,1] = 1234
 foo[3,2] = 30400

...

Как мне добиться этого с помощью bash? Или есть рекомендации по изменению разделителей .cfg файла? Как это гибко с нуля

С уважением Джо С.

Ответы [ 3 ]

0 голосов
/ 08 октября 2019

Альтернативой будет использование имени атрибута в качестве первого ключа, чтобы можно было запросить $ {foo [map_a, 2}} - 2-й атрибут map_a

#! /bin/bash
declare -A foo
n=0
maxcol=0
maxcol=0
IFS=" ,"
while read k v ; do
        foo[$n,0]=$k
        IFS=', ' read -r -a vv <<< "$v"
        i=1
        for v1 in ${vv[*]} ; do
                # Use key as first index
                foo[$k,$i]=$v1
                [ $i -gt $maxcol ]  && maxcol=$i
                let i=i+1
        done
        let n=n+1
done < config.txt
for i in map_a map_b map_c map_d map_e map_f ; do
        for ((j=0 ; j<maxcol ; j++)) do
                echo "foo($i,$j)=${foo[$i,$j]}"
        done
        echo
done
0 голосов
/ 08 октября 2019

Хорошо, я также поместил maxcol в массив:

declare -A foo
declare -A maxcol
n=0
IFS=" ,"
while read k v
do
    foo[$n,0]=$k
    IFS=', ' read -r -a vv <<< "$v"
    i=1
    for v1 in ${vv[*]}
    do
        foo[$n,$i]=$v1
        let i=i+1
    done
    maxcol[$n]=$i
    let n=n+1
done < config.txt

for (( i=0; i<n; i++ ))
do
    for (( j=0 ; j<maxcol[$i] ; j++ ))
    do
        echo "foo($i,$j)=${foo[$i,$j]}"
    done
    echo "maxcol($i)=${maxcol[$i]}"
    echo
done

Я думаю, что теперь это будет соответствовать моим потребностям.

0 голосов
/ 08 октября 2019

Массивы Bash являются одномерными, но ассоциированные массивы могут позволить вам представить нечто, похожее на двумерный массив (каждый ключ будет индексом в сочетании с ','). Без изменения структуры:

#! /bin/bash
declare -A foo
n=0
maxcol=0
IFS=" ,"
while read k v ; do
    foo[$n,0]=$k
    IFS=', ' read -r -a vv <<< "$v"
    i=1
    for v1 in ${vv[*]} ; do
        foo[$n,$i]=$v1
        [ $i -gt $maxcol ]  && maxcol=$i
        let i=i+1
    done
    let n=n+1
done < config.txt
for ((i=0; i<n ; i++)) do
    for ((j=0 ; j<maxcol ; j++)) do
        echo "foo($i,$j)=${foo[$i,$j]}"
    done
    echo
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...