私は、ユーザーに列数と列に入れる項目数を尋ねる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
各数字の後に改行文字を挿入するだけです。
使用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
左揃えの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
最初のコードを模倣します。