使用 for 循环显示列数和列中的项目数

使用 for 循环显示列数和列中的项目数

我正在编写一个 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数字后插入换行符即可。

使用seqawk

$ 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开始时的代码。

相关内容