我正在编写一个 BASH 脚本,询问用户列数以及要放入列中的项目数。然后,脚本将使用 for 循环将数字放入列中。
# Number of columns
cols=$1
# Number of items
num=$2
# Iterator variable
count=1
# Number of rows
rows=$(( ($num + ($cols - 1)) / $cols ))
for x in $(seq 1 1 $rows)
do
for y in $(seq 1 1 $cols)
do
echo -ne "$count\t"
(( count++ ))
done
echo ""
done
例如,如果我输入 6 列,其中包含 28 个项目,这就是输出应该看起来像。
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28
但是,这是我使用当前代码得到的输出。
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
预先感谢大家的帮助!
答案1
您永远不必计算所需的行数。您只需确保在每个$cols
数字后插入换行符即可。
使用seq
和awk
:
$ num=28
$ cols=6
$ seq "$num" | awk -v cols="$cols" '{ printf "%-4d", $1 } NR % cols == 0 { printf "\n" } END { printf "\n" }'
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28
这会将读取的每个数字打印为seq
左对齐的十进制数字,每个数字允许四个字符的宽度,并且没有尾随换行符。然后,每当打印一行数字后以及最后,它都会输出一个换行符。
使用该rs
工具:
$ num=28
$ cols=6
$ seq "$num" | rs 0 "$cols"
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28
如果你需要使用 shell 循环来做到这一点,例如bash
:
$ num=28
$ cols=6
$ for ((i=1; i<=num; ++i)); do printf '%-4d' "$i"; (( i%cols == 0 )) && echo; done; echo
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28
这模仿了awk
开始时的代码。