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


17

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

파일에는 약 16,000 줄이 있습니다. 파일을로드 할 수 있는지 확인하기 위해 처음에는 4 개의 별도 파일로 나누고 싶습니다.

내가 얻을 수있는 첫 번째 부분 head -4000 file.txt. 중간 섹션은 약간 까다 롭습니다. tail출력을 head( tail -4001 file.txt | head -4000 > section2.txt) 에 파이핑하는 것에 대해 생각하고 있었지만 다른 방법이 있습니까?

실제로 내 논리가 엉망이됩니다. 섹션 2의 경우와 같은 것이 필요 하고 다음 섹션 tail -12001 file.txt | head - 4000tail인수를 낮추십시오 . 벌써 혼란 스러워요! :피

답변:


27

엉망이되지 않고 여전히 tailand 을 사용하여 수행하려는 경우 끝이 아닌 처음부터 줄 수 headtail사용하여 호출하는 유용한 방법이 있습니다 .

tail -n +4001 yourfile | head -4000

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

split -l 4000 yourInputFile thePrefixForOutputFiles

( man split의심이 있는지 보십시오 )


19

머리와 꼬리를 결합하면 효과가 있지만 이것을 사용하려면 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
나는 sed 방식을 좋아한다.
fanchyna 2019

sed가 종료되지 않기 때문에 이것은 작동하지 않습니다. stdout하려는 행을 인쇄하지만 ctrl-c를 출력해야하므로 결과적으로 파일로 리디렉션 할 수 없습니다. 사용할 수있는 제안이 있습니까?
Brent212

알아 냈습니다! "sed -n '<start_line>, <end_line> w <output_file>'<input_file>"은 저에게 효과적입니다.
Brent212

@ Brent212 주목해야 할 또 다른 옵션은 출력을 줄이거 나 파일로 출력을 리디렉션 할 수도 있다는 것입니다.
Kyle s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.