次のように構成された一連の三項値を取得しようとしています。
0 0 0 0 1
0 0 0 0 2
0 0 0 1 0
0 0 0 1 1
.........
.........
2 2 2 2 2
これを行うには、次を使用します。
for i in `seq 001 242`
do echo 'obase=3; '$i'' | bc | sed 's/\(.\{1\}\)/\1 /g'
done
しかし、私は理解しています
1
2
1 0
1 1
....
2 2 2 2 2
結果に欠けているゼロは、他のスクリプトパラメータとして使用するために重要なので、どのように強制的にエコーするのですか?
答え1
数値の書式設定の場合printf
:
for i in $( seq 1 242 ) ; do
printf '%05d\n' $( bc <<< 'obase=3; '$i )
done | sed 's/\(.\)/\1 /g'
また、後ろに空の文字列を入れる必要もなく、正規表現で量子化を行う必要$i
もありません。{1}
zsh、ksh93、bash、または次の中かっこ拡張を使用する方が高速ですyash -o braceexpand
。
printf '%s\n' {0..2}\ {0..2}\ {0..2}\ {0..2}\ {0..2}
答え2
ループは実際には必要ないので、次のようにします。
( echo "obase=3"; seq 1 242 ) |
bc |
sed -e 's!^!00000!' -e 's!^0*\(.....\)$!\1!' -e 's!.!& !g'
これが行うことは、左側に5つのゼロを追加してから右側の5つの数字を取り、各数字を次の数字とスペースで区切ることです。
答え3
zsh
またはを使用して、ksh93
次のこともできます。
typeset -i3 i
for ((i = 1; i <= 242; i++)) { printf '%05d\n' "${i#*#}"; }
そして ksh93
:
printf '%05..3d\n' {1..242}
そしてzsh
:
for ((i = 0; i <= 242; i++)) printf '%05d\n' $(([##3]i))
数字の間にスペースを挿入するには、すべてパイプsed 's/./& /;s/ $//'
(またはsed 's/./ &/2g'
GNUを使用)を使用してください。sed
または以下を使用してzsh
:
for ((i = 0; i <= 242; i++)) print ${(s::)${(l:5::0:)$(([##3]i))}}