如何在bash中使用'readarray'来读取文件中的行到2D数组中

use*_*874 14 arrays bash

假设我有一个文本文件'demo.txt',其中包含一个表格,如下所示:

1 2 3    
4 5 6    
7 8 9    
Run Code Online (Sandbox Code Playgroud)

现在,我想在bash中使用'readarray'命令分别读取每一行,所以我写道:

readarray myarray < demo.txt   
Run Code Online (Sandbox Code Playgroud)

问题是它不起作用.如果我尝试打印'myarray':

echo $myarray
Run Code Online (Sandbox Code Playgroud)

我明白了:

1 2 3
Run Code Online (Sandbox Code Playgroud)

另外,如果我写:

echo ${myarray[1]}
Run Code Online (Sandbox Code Playgroud)

我明白了:

4 5 6
Run Code Online (Sandbox Code Playgroud)

代替:

2
Run Code Online (Sandbox Code Playgroud)

正如我所料.这是为什么?如何分别访问每一行并在该行中访问每个成员?

dam*_*ois 17

这是预期的行为.readarray将创建一个数组,其中数组的每个元素都是输入中的一行.

如果要查看整个阵列,则需要使用

echo "${myarray[@]}"
Run Code Online (Sandbox Code Playgroud)

因为echo "$myarray只会输出myarray[0],而且${myarray[1]}是数据的第二行.

你在寻找的是一个二维数组.比如看看这个.

如果你想要一个包含第一行内容的数组,你可以这样做:

$ read -a arr < demo.txt 
$ echo ${arr[0]}
1
$ echo ${arr[1]}
2
$ echo ${arr[2]}
3
Run Code Online (Sandbox Code Playgroud)


Rad*_*iel 7

readarray rows < demo.txt                                           

for row in "${rows[@]}";do                                                      
  row_array=(${row})                                                            
  first=${row_array[0]}                                                         
  echo ${first}                                                                 
done 
Run Code Online (Sandbox Code Playgroud)


Eri*_*ric 5

为了扩展达米安的答案(因为我还不能提交评论......),你只需迭代阅读即可。我的意思是类似下面的内容

exec 5<demo.txt
for i in `seq 1 ${numOfLinesInFile}`
do
read -a arr -u 5
  for j in `seq 0 ${numOfColumnsMinus1}`
  do
  echo ${arr[$j]}
  done
done
Run Code Online (Sandbox Code Playgroud)

我希望你已经找到了解决方案(抱歉打扰了......)。我在帮助教导朋友时偶然发现了此页面,并认为其他人也可能会这样做。