
我正在嘗試獲取這樣組織的三元值序列:
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
使用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))}}