基数変換のエコーで先頭のゼロを強制する

基数変換のエコーで先頭のゼロを強制する

私は次のように構成された3進値のシーケンスを取得しようとしています:

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  

結果に欠落している 0 は別のスクリプト パラメータとして使用するために重要なので、これを強制的にエコーするにはどうすればよいでしょうか?

答え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 を使用します)。または を使用します:sedzsh

for ((i = 0; i <= 242; i++)) print ${(s::)${(l:5::0:)$(([##3]i))}}

関連情報