41703
10002
30003
40002
40000
20203
20203
30100
50000
50000
50000
50000
70700
70600
이 파일이 있습니다. 나는 출력을 원한다.
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
저는 솔라리스 머신을 작업하고 있습니다.
답변1
Awk
해결책:
awk '{ printf "%d.%d.%d\n", substr($1,1,1), substr($1,2,3)/10, substr($1,5) }' file
substr(string, start [, length ])
- 문자 기호에서 시작하여length
한 문자 길이의 하위 문자열을 반환합니다 .string
start
산출:
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
GNU가 지원되는 경우 awk
더 짧은 방법은 다음과 같습니다.
awk -v FS="" '{ print $1, ($2$3$4)/10, $5 }' OFS='.' file
FS=""
- 값이 빈 문자열(""
)인 경우 레코드의 각 문자는 별도의 필드가 됩니다.
답변2
$ sed -e 's/\(.\)\(..\)\(..\)/\1.\2.\3/' -e 's/\.0/./g' file
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0
첫 번째 대체는 에서 sed
생성되었습니다 . 이는 별도의 캡처 그룹에서 세 개의 문자 세트(단일 문자와 일치하는 각 포인트에 대해 두 개의 문자)를 캡처한 다음 그 사이에 포인트를 사용하여 해당 문자를 다시 삽입하는 방식으로 수행됩니다.x.yy.zz
xyyzz
\(.\)
\(..\)
두 번째 대체는 점 뒤의 모든 0을 즉시 제거합니다.
답변3
GNU sed 솔루션
sed -r 's/\B(..)/.\1./; s/\.0/./g' input.txt
\비- 단어 경계를 제외한 모든 위치에서 일치합니다. 즉, 왼쪽 문자와 오른쪽 문자가 "단어" 문자이거나 둘 다 "비단어" 문자인 경우 일치합니다.
sed
GNU 기능이 없는 솔루션
sed -r 's/(.)(..)/\1.\2./; s/\.0/./g' input.txt
산출
4.17.3
1.0.2
3.0.3
4.0.2
4.0.0
2.2.3
2.2.3
3.1.0
5.0.0
5.0.0
5.0.0
5.0.0
7.7.0
7.6.0