최대 2300개의 부품이 포함된 대용량 텍스트 파일이 있습니다. 각 섹션은 이전 줄에서 시작하며, 줄 끝에 페이지 번호 "PAGE 1"이 표시됩니다.
예:
T5271-AX1 TITLE DATE
SUB TITLE PAGE 1
LINE1
LINE2
T5271-AX1 TITLE PAGE 2
LINE3
LINE4
SUB TITLE PAGE 3
LINE5
T5271-BX1 DATE
SUB TITLE PAGE 1
LINE1
파일에는 최대 2300개의 섹션이 있을 수 있으며 각 섹션의 길이는 수백 페이지가 될 수 있지만 섹션의 줄 끝에는 항상 "PAGE 1"이 있습니다.
파일 이름은 "PAGE 1" 위 줄의 첫 9-15자 문자열에 포함됩니다.
"PAGE 1"에서 파일을 분할하고 출력 파일 이름에 9-15자를 사용하고 싶습니다.
내 예에서 최종 결과는 두 개의 파일이 됩니다.
T5271-AX1
T5271-BX1
페이지 번호와 제목은 쉽게 찾을 수 있지만, 다음에 "PAGE 1"이 나타날 때까지 파일을 분할하여 새 파일로 출력하는 방법을 모르겠습니다.
어떤 도움이라도 대단히 감사하겠습니다.
답변1
$ cat tst.awk
/ PAGE 1$/ {
close(out)
split(prev,p)
out = p[1]
}
NR > 1 { print prev > out }
{ prev = $0 }
END { print prev > out }
$ awk -f tst.awk file
$ head T*
==> T5271-AX1 <==
T5271-AX1 TITLE DATE
SUB TITLE PAGE 1
LINE1
LINE2
T5271-AX1 TITLE PAGE 2
LINE3
LINE4
SUB TITLE PAGE 3
LINE5
==> T5271-BX1 <==
T5271-BX1 DATE
SUB TITLE PAGE 1
LINE1
답변2
이 명령 csplit
은문맥분할하면 요청한 대로 수행됩니다.
csplit -sz file '/ PAGE 1$/-1' '{*}'
for f in xx*;do
mv -f -- "$f" "$(< "$f" head -n1 | cut -f1 -d" ")"
done