Arrays 如何使用Bash打印特定的数组行?

Arrays 如何使用Bash打印特定的数组行?,arrays,linux,bash,Arrays,Linux,Bash,我目前正在bash中使用矩阵。比如说,我在一个文件中有一个2x4矩阵: 1 2 3 4 5 6 7 8 我已从该文件中读取,并已将所有这些元素存储在一个数组中,例如: my_arr={1 2 3 4 5 6 7 8} 接下来,我通过管道传输回显输出,使空格变为选项卡: echo ${my_arr[@]} | tr ' ' '\t' **output**: my_arr={1 2 3 4 5 6 7 8} 我现在

我目前正在bash中使用矩阵。比如说,我在一个文件中有一个2x4矩阵:

1    2    3    4
5    6    7    8
我已从该文件中读取,并已将所有这些元素存储在一个数组中,例如:

my_arr={1 2 3 4 5 6 7 8}
接下来,我通过管道传输回显输出,使空格变为选项卡:

echo ${my_arr[@]} | tr ' ' '\t'
**output**: 
my_arr={1    2    3    4    5    6    7    8}
我现在的问题是,我想在每四个元素打印一行之后再打印一行;换句话说,我可以逐行或逐行打印数组吗

编辑 以下是我的实际代码:

array=()
cols #This contains number of columns

while read line1 <&3
do
    for i in $line1
    do
        array+=($i)
    done
done 3<$2

#Now, array has all the desired values. I need to print them out.
以下是我的阵列中的内容:

(1 2 3 4 5 6 7 8)
试试这个:

printf '%s\t%s\t%s\t%s\n' "${my_arr[@]}"
格式字符串有四个字段说明符全部为%s-只是由\t tab分隔并以换行符结尾的普通字符串,它将以该格式一次打印四个数组元素。

尝试以下操作:

printf '%s\t%s\t%s\t%s\n' "${my_arr[@]}"

格式字符串有四个字段说明符,全部为%s-只是由\t tab分隔并以换行符结尾的普通字符串,它将以该格式一次打印四个数组元素。

一个可能的丑陋解决方案是存储矩阵的大小 在单独的变量行和列中。请尝试以下操作:

set -f                      # prevent pathname expansion
array=()
rows=0
while read line1 <&3; do
    vec=($line1)            # split into elements
    cols=${#vec[@]}         # count of elements
    array+=(${vec[@]})
    rows=$((++rows))        # increment #rows
done 3<"$2"

# echo $rows $cols          # will be: 2 and 4

ifs_back="$IFS"             # back up IFS
IFS=$'\t'                   # set IFS to TAB
for ((i=0; i<rows; i++)); do
    j=$((i * cols))
    echo "${array[*]:$j:$cols}"
done
IFS="$ifs_back"             # restore IFS

希望这有帮助。

一个可能的丑陋解决方案是存储矩阵的大小 在单独的变量行和列中。请尝试以下操作:

set -f                      # prevent pathname expansion
array=()
rows=0
while read line1 <&3; do
    vec=($line1)            # split into elements
    cols=${#vec[@]}         # count of elements
    array+=(${vec[@]})
    rows=$((++rows))        # increment #rows
done 3<"$2"

# echo $rows $cols          # will be: 2 and 4

ifs_back="$IFS"             # back up IFS
IFS=$'\t'                   # set IFS to TAB
for ((i=0; i<rows; i++)); do
    j=$((i * cols))
    echo "${array[*]:$j:$cols}"
done
IFS="$ifs_back"             # restore IFS


希望这能有所帮助。

好吧,这是个好主意;但我不一定要一次打印4张。有些矩阵一行中可能有5个元素,或2个元素。我只想逐行打印数组。@DarrelGulseth行的定义是什么?bash数组本质上是一维的,因此任何其他组织(如行和列)都必须来自其他地方。因此,基本上,我的文件最初有一个以制表符分隔的数组,包含我在文章中描述的行和列。我读取这些数字,将它们存储在一个数组中,并希望将它们以行和列分开的方式完全按文件选项卡中的显示方式打印出来。在这种情况下,我同意@karakfa的评论:通过将输入转换为一维数组,您正在丢失数据的结构。您可能能够在读取数据时单独记录数据的形状,然后使用它来控制输出,但这实际上取决于实际目标是什么。如果您只是想把它写出来,那么最好还是保持文本行格式,并以该格式进行任何必要的处理。大概这真的取决于你要对数据做什么。戈登,这个项目的一个要求是我必须把它完全按照文件写出来。好吧,这是个好主意;但我不一定要一次打印4张。有些矩阵一行中可能有5个元素,或2个元素。我只想逐行打印数组。@DarrelGulseth行的定义是什么?bash数组本质上是一维的,因此任何其他组织(如行和列)都必须来自其他地方。因此,基本上,我的文件最初有一个以制表符分隔的数组,包含我在文章中描述的行和列。我读取这些数字,将它们存储在一个数组中,并希望将它们以行和列分开的方式完全按文件选项卡中的显示方式打印出来。在这种情况下,我同意@karakfa的评论:通过将输入转换为一维数组,您正在丢失数据的结构。您可能能够在读取数据时单独记录数据的形状,然后使用它来控制输出,但这实际上取决于实际目标是什么。如果您只是想把它写出来,那么最好还是保持文本行格式,并以该格式进行任何必要的处理。大概这真的取决于你要对数据做什么。戈登,这个项目的一个要求是我必须把它完全按照文件写出来。很可能将2D数组转换为1D并返回2D不是正确的方法。最好的方法取决于您如何处理元素……正如我在前面的问题上所评论的,{…}不会创建数组。我的婚姻只是一根绳子。你想要我的arr=123445678。@chepner,你说得对;然而,这并不是我最初在代码中写的内容。我有正确的数组和正确的元素,我只需要把它们打印出来。你的代码里有什么还不清楚。发布你所拥有的,而不是使用非标准伪语法的模糊描述。好的,我道歉。我将把这篇文章编辑到我的原始文章中。最有可能的做法是将2D数组转换为1D并返回2D。最好的方法取决于您如何处理元素……正如我在前面的问题上所评论的,{…}不会创建数组。我的婚姻只是一根绳子。你想要我的arr=123445678。@chepner,你说得对;然而,这并不是我最初在代码中写的内容。我有正确的数组和正确的元素,我只需要把它们打印出来。你的代码里有什么还不清楚。发布你所拥有的,而不是使用非标准伪语法的模糊描述。好的,我道歉。我将把这篇文章编辑到我的原始文章中。我会添加set-f,这样拆分就可以了
nto元素步骤不执行路径扩展。@glenn jackman谢谢。让我在代码中加入您的建议。我会添加set-f,这样“拆分为元素”步骤就不会执行路径扩展。@glenn jackman谢谢。让我把你的建议写进我的代码里。