我正在尝试获取这样组织的三元值序列:
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))}}