基数変換エコーの前にゼロを強制します。

基数変換エコーの前にゼロを強制します。

次のように構成された一連の三項値を取得しようとしています。

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))}}

関連情報