我在多维数组中存储了值。打印值时,它会打印第二个迭代值,并且第一次迭代正在被替换

时间:2017-02-04 22:41:31

标签: bash unix

这段代码循环遍历文件并将每个单词加载到多维数组中。

lcv=0
declare -A db
while read line;
do
  lcv1=0
  echo $line
  for i in $line;
  do
    db[$lcv,$lcv1]=$i
    echo $lcv,$lcv1,${db[$lcv,$lcv1]};
    #echo ${db[$lcv]}
    ((++lcv1))
  done
  ((++lcv))
done < data.txt # File Contains records of 4 fields.
echo ${db[0,1]}
echo ${db[0,0]}

2 个答案:

答案 0 :(得分:2)

使用

的小伪二维数组

我只是重复使用你的算法,扼杀所有echo和无用的步骤。

#!/bin/bash
unset x y db
y=0
declare -A db
while read line ;do
    for i in $line ;do
        db[$((x++)),$y]=$i
    done
    ((y++))
    x=0
  done <<<$'0 1 2 3\n4 5 6 7\n8 9 a b\nc d e f'

现在,如果你

declare -p db x y

bash将打印:

declare -A db='([0,0]="0" [0,1]="4" [0,2]="8" [0,3]="c" [3,3]="f" [3,2]="b" [3,1]="7" [3,0]="3" [2,2]="a" [2,3]="e" [2,0]="2" [2,1]="6" [1,1]="5" [1,0]="1" [1,3]="d" [1,2]="9" )'
declare -- x="0"
declare -- y="4"

此时,我只想改变第9行:((y++)) ((y++,maxx=maxx>x?maxx:x))。这将填充maxx(此示例中为4

然后反转数组:

for i in {0..4};do           # this syntax is nice, but don't support variables
    for((j=0;j<y;j++)){      # this syntaxe could use variables
        echo -n ${db[$i,$j]}\ 
    }
    echo
done

将打印:

0 4 8 c 
1 5 9 d 
2 6 a e 
3 7 b f 

答案 1 :(得分:1)

如果data.txt包含:

$ cat data.txt
l0val0 l0val1 l0val2 l0val3
l1val0 l1val1 l1val2 l1val3
l2val0 l2val1 l2val2 l2val3
l3val0 l3val1 l3val2 l3val3
l4val0 l4val1 l4val2 l4val3
l5val0 l5val1 l5val2 l5val3

你的程序产生了这个:

$ ./script
l0val0 l0val1 l0val2 l0val3
0,0,l0val0
0,1,l0val1
0,2,l0val2
0,3,l0val3
l1val0 l1val1 l1val2 l1val3
1,0,l1val0
1,1,l1val1
1,2,l1val2
1,3,l1val3
l2val0 l2val1 l2val2 l2val3
2,0,l2val0
2,1,l2val1
2,2,l2val2
2,3,l2val3
l3val0 l3val1 l3val2 l3val3
3,0,l3val0
3,1,l3val1
3,2,l3val2
3,3,l3val3
l4val0 l4val1 l4val2 l4val3
4,0,l4val0
4,1,l4val1
4,2,l4val2
4,3,l4val3
l5val0 l5val1 l5val2 l5val3
5,0,l5val0
5,1,l5val1
5,2,l5val2
5,3,l5val3
l0val1
l0val0

这表明$lcv的值选择了每一行(行),$lcv1的值选择了空格或制表符上划分的每个单词(记录)。

从我能看到的方面它正常工作。

如果我们在脚本末尾添加这些行:

echo "end of first script"
for i in {0..5}; do
    for j in {0..3}; do
    printf 'db[%s,%s]=%s  ' "$i" "$j" "${db[$i,$j]}"
    done
    echo
done

echo
declare -p db

我们将获得此输出:

end of first script
db[0,0]=l0val0  db[0,1]=l0val1  db[0,2]=l0val2  db[0,3]=l0val3  
db[1,0]=l1val0  db[1,1]=l1val1  db[1,2]=l1val2  db[1,3]=l1val3  
db[2,0]=l2val0  db[2,1]=l2val1  db[2,2]=l2val2  db[2,3]=l2val3  
db[3,0]=l3val0  db[3,1]=l3val1  db[3,2]=l3val2  db[3,3]=l3val3  
db[4,0]=l4val0  db[4,1]=l4val1  db[4,2]=l4val2  db[4,3]=l4val3  
db[5,0]=l5val0  db[5,1]=l5val1  db[5,2]=l5val2  db[5,3]=l5val3  
declare -A db=([1,1]="l1val1" [1,0]="l1val0" [1,3]="l1val3" [1,2]="l1val2" [0,0]="l0val0" [0,1]="l0val1" [0,2]="l0val2" [0,3]="l0val3" [5,1]="l5val1" [5,0]="l5val0" [5,3]="l5val3" [5,2]="l5val2" [3,3]="l3val3" [3,2]="l3val2" [3,1]="l3val1" [3,0]="l3val0" [2,2]="l2val2" [2,3]="l2val3" [2,0]="l2val0" [2,1]="l2val1" [4,0]="l4val0" [4,1]="l4val1" [4,2]="l4val2" [4,3]="l4val3" )

现在,问题是:你认为这是错的?