이 문제를 해결하는 방법을 묻고 싶습니다. 단어가 4자 미만인 모든 줄 앞에 0을 추가해야 합니다.
입력 파일 예:
30
1
508
A0EA
A0EB
A0EC
A0ED
원하는 출력은 다음과 같아야 합니다.
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
귀하의 지원에 진심으로 감사드립니다.
답변1
모든 줄에 4개의 앞에 0을 추가한 다음 각 줄의 마지막 4개 문자를 가져올 수 있습니다.
sed 's/^/0000/; s/^.*\(.\{4\}\)/\1/' < file
또는 처음부터 4자리보다 넓은 숫자를 자르지 마세요.
sed 's/^/0000/; s/^.\{1,4\}\(.\{4\}\)/\1/' < file
답변2
혼합도 있습니다:
$ numfmt --format='%04.0f' --invalid=ignore < file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
numfmt
GNU Coreutils 패키지에서 제공됩니다.
답변3
입력이 16진수인 경우 strtonum()에 GNU awk를 사용하세요.
$ awk '{printf "%04X\n", strtonum("0x"$0)}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
입력이 16진수인지 아닌지에 관계없이 GNU awk를 사용하십시오.
$ awk '{print gensub(/ /,0,"g",sprintf("%4s",$0))}' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
awk의 경우 입력이 16진수인지 여부에 관계없이 다음을 수행하세요.
$ awk '{v=sprintf("%4s",$0); gsub(/ /,0,v); print v}' file
0030
0001
0508
A0EA
A0EB
A0EC
심지어:
$ awk '{$0=sprintf("%4s",$0); gsub(/ /,0)} 1' file
0030
0001
0508
A0EA
A0EB
A0EC
A0ED
답변4
zsh
쉘 의 경우 l:length::string:
왼쪽 패딩 인수를 사용하여 플래그를 확장할 수 있습니다.
$ var=FF
$ echo ${(l:4::0:)var}
00FF
파일의 모든 단어에 적용하려면 다음을 수행하십시오.
printf '%s\n' ${(l:4::0:)$(<file)}
이 연산자도 참고하세요.자르기4자를 초과하는 단어입니다.