데이터베이스 삽입을 위해 큰 텍스트 파일을 구문 분석하는 PHP 스크립트를 작성 중입니다. 그러나 내 호스트에서는 파일이 너무 커서 PHP의 메모리 제한에 도달했습니다.
파일 길이는 약 16,000줄입니다. 먼저 파일을 4개의 개별 파일로 분할하여 로드할 수 있는지 확인하고 싶습니다.
내가 얻을 수 있었던 첫 번째 부분 head -4000 file.txt
. 중간 부분은 약간 까다롭습니다. 출력을 ( ) tail
로 파이프하려고 생각하고 있는데 다른/더 좋은 방법이 있습니까?head
tail -4001 file.txt | head -4000 > section2.txt
실제로 내 논리는 엉망입니다. 두 번째 섹션에는 이와 같은 것이 필요 하고 다음 섹션에서는 인수를 tail -12001 file.txt | head - 4000
낮추십시오 . tail
엉켜버렸어요! :피
답변1
엉망으로 만들고 싶지 않지만 여전히 tail
and 를 사용하여 수행하는 경우 줄 수를 사용하여 끝 대신 처음부터 호출하는 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
오직이 기능의 경우 이 답변은 어떤 이유로 이미 설치되어 있는 경우 유용합니다.