如何将类似表格的文件读入多个数组(bash)

mbr*_*ero 1 bash

如果我有一个包含多个字符串的文件 example1.txt

str1
str2
str3
...
Run Code Online (Sandbox Code Playgroud)

我可以通过使用将它们读入 bash 数组

mapfile -t mystrings < example1.txt.
Run Code Online (Sandbox Code Playgroud)

现在说我的文件 example2.txt 被格式化为表格

str11 str12 str13
str21 str22 str23
str31 str32 str33
...   ...   ...
Run Code Online (Sandbox Code Playgroud)

我想将每一列读入不同的数组。我知道我可以使用其他工具(例如 awk)将每一行分隔为字段。有什么方法可以将此功能与 mapfile 结合起来吗?我正在寻找类似的东西

mapfile -t firstcol < $(cat example2.txt | awk '//{printf $1"\n"}')
mapfile -t secondcol < $(cat example2.txt | awk '//{printf $2"\n"}')
Run Code Online (Sandbox Code Playgroud)

(这不起作用)。

关于如何在 bash 中处理表格的任何其他建议也是受欢迎的。

che*_*ner 6

读取每一很简单,所以让我们以此为基础。我假设你有一个合适的矩阵(即,每一行都有相同的列数。因为你使用的是bash4.3,这会容易得多。

while read -a row; do
    c=0
    for value in "${row[@]}"; do
        declare -n column=column_$(( c++ ))
        column+=( "$value" )
    done
done < table.txt
Run Code Online (Sandbox Code Playgroud)

那里!现在,它奏效了吗?

$ echo "${column_0[@]}"
str11 str21 str31 
$ echo "${column_1[@]}"
str12 str22 str32
Run Code Online (Sandbox Code Playgroud)

我想是这样!

declare -n使用在我们迭代每一行时递增的计数器为数组(由下一行隐式声明)创建一个名称引用+=。然后我们简单地将当前列值附加到当前 nameref 后面的数组中。