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

たとえば、28項目を含む6列を入力すると、次の結果が出力されます。しなければならないのように見えます。

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左揃えの10進数で印刷され、数字あたりの幅は4文字で、末尾の改行は許可されません。その後、数字行を印刷し、最後に毎回改行文字を出力します。

この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

もしあなたなら必要これを行うには、シェルループを使用してください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最初のコードを模倣します。

関連情報