在基數轉換的回顯中強制前導零

在基數轉換的回顯中強制前導零

我正在嘗試獲取這樣組織的三元值序列:

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'

其作用是在左側加五個零,然後取最右邊的五位數字,並用空格將每個數字與下一個數字分隔開。

答案3

使用zshksh93,您還可以執行以下操作:

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

相關內容