저는 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개의 문자 ^
와 L
1개의 리터럴 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.txt
각 test.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
출력을 p
0보다 크게 제한함으로써 출력되기 전에 적어도 하나의 페이지 태그를 구문 분석해야 합니다.
답변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'
- 단위 구분 기호는 다음과 같습니다.^L500개 단위로 분할된 파일
Bash에서는 8진수 ^L표기법 ^V ^L을 사용하는 것도 가능합니다.
split -t $'\014' ...
답변4
텍스트 파일인가요, 아니면 좀 더 복잡한 파일(PDF, WORD 등)인가요? 어쩌면 내장된 split
명령을 시도해 봐야 할 수도 있습니다. 다음과 같이 작동합니다
split -l1000 textfile
이렇게 하면 텍스트 파일이 각각 1000줄을 포함하는 여러 파일로 분할됩니다.