在基数转换的回显中强制前导零

在基数转换的回显中强制前导零

我正在尝试获取这样组织的三元值序列:

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

相关内容