Как напечатать определенные строки массивов, используя Bash? - PullRequest
0 голосов
/ 29 января 2019

Я сейчас работаю с матрицей в 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 голосов
/ 30 января 2019

Одним из возможных (некрасивых) решений было бы сохранение размера матрицы в отдельных переменных 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

Надеюсь, это поможет.

0 голосов
/ 29 января 2019

Попробуйте это:

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

Строка формата имеет четыре спецификатора поля (все %s - просто простые строки), разделенных \t (табуляция) и заканчивающихся \n (новая строка), он будет печатать четыре элемента массива одновременно в этом формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...