기본 변환 에코에서 앞에 0을 강제 적용

기본 변환 에코에서 앞에 0을 강제 적용

나는 다음과 같이 구성된 삼항 값의 시퀀스를 얻으려고 합니다.

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개의 0을 추가한 다음 가장 오른쪽의 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를 사용하여 ) 모두 파이프하십시오 . sed또는 다음을 사용하여 zsh:

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

관련 정보