sed 또는 awk를 사용하여 줄의 첫 번째 X 위치를 사용하여 파일을 여러 파일로 분할

sed 또는 awk를 사용하여 줄의 첫 번째 X 위치를 사용하여 파일을 여러 파일로 분할

최대 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

관련 정보