파일 목록에서 특정 열 잘라내기 및 바꾸기

파일 목록에서 특정 열 잘라내기 및 바꾸기
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한 문자 길이의 하위 문자열을 반환합니다 .stringstart

산출:

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.zzxyyzz\(.\)\(..\)

두 번째 대체는 점 뒤의 모든 0을 즉시 제거합니다.

답변3

GNU sed 솔루션

sed -r 's/\B(..)/.\1./; s/\.0/./g' input.txt

\비- 단어 경계를 제외한 모든 위치에서 일치합니다. 즉, 왼쪽 문자와 오른쪽 문자가 "단어" 문자이거나 둘 다 "비단어" 문자인 경우 일치합니다.

sedGNU 기능이 없는 솔루션

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

관련 정보