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

时间:2019-01-29 19:12:09

标签: 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}

我现在的问题是,我希望每打印四个元素后就有一个NEW-LINE;换句话说,我是否可以逐行或逐行打印数组?

编辑 这是我实际代码中的内容:

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

这是我的数组内部的内容:

(1 2 3 4 5 6 7 8)

2 个答案:

答案 0 :(得分:2)

尝试一下:

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

格式字符串有四个字段说明符(全部为%s-仅是纯字符串),由\t(制表符)分隔并以\n(换行符)结尾,它将打印以此格式一次排列四个元素。

答案 1 :(得分:2)

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

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

输出:

1       2       3       4
5       6       7       8

希望这会有所帮助。