我目前正在使用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)
答案 0 :(得分:2)
尝试一下:
printf '%s\t%s\t%s\t%s\n' "${my_arr[@]}"
格式字符串有四个字段说明符(全部为%s
-仅是纯字符串),由\t
(制表符)分隔并以\n
(换行符)结尾,它将打印以此格式一次排列四个元素。
答案 1 :(得分:2)
一种可能的(丑陋的)解决方案是存储矩阵的大小
在单独的变量rows
和cols
中。请尝试以下操作:
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
希望这会有所帮助。