1200페이지 문서를 500페이지로 나눈 후 나머지 페이지를 500페이지로 나눕니다.

1200페이지 문서를 500페이지로 나눈 후 나머지 페이지를 500페이지로 나눕니다.

저는 Unix 세계를 처음 접했고 ^L. 페이지.

첫 번째 파일을 찾기 위해 파일을 읽고 ^L임시 파일에 대한 다음 500개의 출력을 계산하고 다음 임시 파일을 만들기 위해 계속 읽으려고 합니다. 아니면 더 효율적인 방법이 있습니까?

내 스크립트는 bash 실행으로 작성되었습니다.MKS 툴킷.

답변1

^L모든 페이지가 (text)로 시작한다고 가정합니다 Ctrl+L.

awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } { print > f }' file.txt

행 수를 계산하고 ^L, 1을 뺀 값이 500의 인수인 경우(1페이지, 501페이지, 1001페이지 등) 변수를 f파일 이름으로 설정하여 다음 텍스트를 출력합니다.

^L코드의 내용은 awk다음과 같습니다.아니요2개의 문자 ^L1개의 리터럴 Ctrl+L(입력을 사용할 수 있음 Ctrl+VCtrl+L) 대신 이것을 사용할 수도 있습니다 \014.

작은 테스트 문서의 경우 test.txt:

^L
page 1
^L
page 2
^L
page 3
^L
page 4

...테스트를 위해 500을 2로 변경하면 두 개의 파일이 생성되고 test.txt-page-1.txttest.txt-page-3.txt파일에는 입력 파일의 두 줄(페이지 마크업 및 텍스트)이 포함됩니다.

test.txt-page-1.txt:

^L
page 1
^L
page 2

test.txt-page-3.txt:

^L
page 3
^L
page 4

구문 분석할 파일에는 분명히 첫 번째 페이지 표시 앞에 헤더가 있습니다. 이 헤더는 무시해야 합니다. 위 명령의 다음 변형은 awk이를 수행합니다.

awk '/^L/ { p++ } (p-1) % 500 == 0 { f = FILENAME "-page-" p ".txt" } p > 0 { print > f }' file.txt

출력을 p0보다 크게 제한함으로써 출력되기 전에 적어도 하나의 페이지 태그를 구문 분석해야 합니다.

답변2

이것은 또 다른 옵션입니다. 이것은 문자에 고정되어 있습니다 ( 두 개의 리터럴 합계가 아닌 ^L단일 문자, 8진수라고 가정합니다 ) . 소스 데이터 파일의 경우 각 페이지를 자체 파일로 분할합니다. 여기에서 이를 필수 블록으로 연결할 수 있습니다.014^Loriginal.txt

# GNU csplit
csplit --prefix='page_' --digits=4 original.txt $'/\014/+1' '{*}'

# MKS csplit
csplit -f 'page_' -n 4 -k original.txt $'/\014/+1' '{9999}'

# Concatenate the required sets of pages together
cat page_{0000..0499} > part_1.txt
cat page_{0500..0999} > part_2.txt
cat page_{1000..9999} > part_3.txt

# Tidy up
rm page_????

답변3

이전 Gnu 분할을 사용할 수 있는 경우:

split -t '^L' -l 500 bigFile part_ 
  • -t '^L' - 단위 구분 기호는 다음과 같습니다.^L
  • 500개 단위로 분할된 파일

  • Bash에서는 8진수 ^L표기법 ^V ^L을 사용하는 것도 가능합니다.split -t $'\014' ...

답변4

텍스트 파일인가요, 아니면 좀 더 복잡한 파일(PDF, WORD 등)인가요? 어쩌면 내장된 split명령을 시도해 봐야 할 수도 있습니다. 다음과 같이 작동합니다

split -l1000 textfile

이렇게 하면 텍스트 파일이 각각 1000줄을 포함하는 여러 파일로 분할됩니다.

관련 정보