텍스트 파일 줄의 중간 부분을 추출하시겠습니까?

텍스트 파일 줄의 중간 부분을 추출하시겠습니까?

데이터베이스 삽입을 위해 큰 텍스트 파일을 구문 분석하는 PHP 스크립트를 작성 중입니다. 그러나 내 호스트에서는 파일이 너무 커서 PHP의 메모리 제한에 도달했습니다.

파일 길이는 약 16,000줄입니다. 먼저 파일을 4개의 개별 파일로 분할하여 로드할 수 있는지 확인하고 싶습니다.

내가 얻을 수 있었던 첫 번째 부분 head -4000 file.txt. 중간 부분은 약간 까다롭습니다. 출력을 ( ) tail로 파이프하려고 생각하고 있는데 다른/더 좋은 방법이 있습니까?headtail -4001 file.txt | head -4000 > section2.txt

실제로 내 논리는 엉망입니다. 두 번째 섹션에는 이와 같은 것이 필요 하고 다음 섹션에서는 인수를 tail -12001 file.txt | head - 4000낮추십시오 . tail엉켜버렸어요! :피

답변1

엉망으로 만들고 싶지 않지만 여전히 tailand 를 사용하여 수행하는 경우 줄 수를 사용하여 끝 대신 처음부터 호출하는 head유용한 방법이 있습니다 .tail

tail -n +4001 yourfile | head -4000

...하지만 특히 파일 분할을 위한 더 나은 자동화 도구는 다음과 같습니다.split! 또한 GNU coreutils의 일부이므로 일반 Linux 시스템에는 이 기능이 있어야 합니다. 사용 방법:

split -l 4000 yourInputFile thePrefixForOutputFiles

( man split궁금한 점이 있으면 확인해 보세요.)

답변2

당신이 했던 것처럼 머리와 꼬리를 결합하는 것은 괜찮지만, 이를 위해서는 다음을 사용하겠습니다.sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

이를 통해 빠른 쉘 기능을 통해 문제를 해결할 수 있습니다.

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

이제 your_file.1-4000 및 yuor_file.4001-8000 등이 있습니다.

참고: bash가 필요합니다.

답변3

당신은 또한 사용할 수 있습니다bat좋다

bat -r 4001:8000 input-file.txt >output-file-1.txt

장점은 작성 중인 내용을 이해하기 위해 출력 리디렉션을 생략할 수 있다는 것입니다.

Bat 프로젝트 사양

참고: 설치가 다소 과도할 수 있습니다.bat 오직이 기능의 경우 이 답변은 어떤 이유로 이미 설치되어 있는 경우 유용합니다.

관련 정보