텍스트 파일을 다시 포맷하는 방법이 있나요?
'n n / [ ] / m / N
'ns @ s / @ z / @ / j @ z / j @ s
'r r
's s / z / [ ]
...
도착하다
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
...
즉, /
행에서 s를 만나면 행은 /
첫 번째 열을 유지하면서 s의 위치를 기준으로 분할됩니다(첫 번째 열 뒤에는 항상 6개의 공백이 있습니다).
tr / '\n' < filename1 > filename2
선을 구분하려고 이렇게 해봤는데
'n n
[ ]
m
N
'ns @ s
@ z
@
j @ z
j @ s
'r r
's s
z
[ ]
...
하지만 연속된 행의 첫 번째 열을 유지할 수는 없습니다.
답변1
모든 Unix 시스템의 모든 쉘에서 awk:
이것이 첫 번째 필드와 줄의 나머지 부분 사이에 있는 탭인 경우:
$ awk 'BEGIN{FS=OFS="\t"} {n=split($2,f," */ *"); for (i=1; i<=n; i++) print $1, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
또는 일련의 공백 문자인 경우:
$ awk 'match($0,/[^ ]+ +/){key=substr($0,1,RLENGTH); n=split(substr($0,1+RLENGTH),f," */ *"); for (i=1; i<=n; i++) print key, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
또는 앞에 고정된 8자 너비 필드인 경우 다음 중 하나를 수행할 수 있습니다.
$ awk '{key=substr($0,1,8); n=split(substr($0,9),f," */ *"); for (i=1; i<=n; i++) print key, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
또는:
$ awk '{n=split(substr($0,9),f," */ *"); for (i=1; i<=n; i++) printf "%-8s%s\n", $1, f[i]}' file
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]
답변2
sed "s/ /\//" filename| awk -F "/" '{for(i=2;i<=NF;i++)print $1,$i}'
산출
'n n
'n [ ]
'n m
'n N
'ns @ s
'ns @ z
'ns @
'ns j @ z
'ns j @ s
'r r
's s
's z
's [ ]