관련이 있지만 만족스러운 답변이 없습니다.대용량 텍스트 파일을 약 500단어 단위로 분할하는 방법은 무엇입니까?
텍스트 파일을 얻으려고 합니다(http://mattmahoney.net/dc/text8.zip) 10^7개 이상의 단어를 한 줄에 모두 넣고 N 단어를 포함하는 줄로 나눕니다. 현재 접근 방식은 작동하지만 다소 느리고 보기 흉합니다(셸 스크립트 사용).
i=0
for word in $(sed -e 's/\s\+/\n/g' input.txt)
do
echo -n "${word} " > output.txt
let "i=i+1"
if [ "$i" -eq "1000" ]
then
echo > output.txt
let "i=0"
fi
done
더 빠르고 더 컴팩트하게 만드는 방법에 대한 팁이 있습니까?
답변1
사용 xargs
(17초):
xargs -n1000 <file >output
-n
최대 인수 수를 정의하는 플래그를 사용합니다 . 원하는 제한 으로 xargs
변경하면 됩니다 .1000
500
10^7 단어가 포함된 테스트 파일을 만들었습니다.
$ wc -w file
10000000 file
시간 통계는 다음과 같습니다.
$ time xargs -n1000 <file >output
real 0m16.677s
user 0m1.084s
sys 0m0.744s
답변2
Perl은 이 점에 매우 능숙한 것 같습니다:
공백으로 구분된 10,000,000개의 단어가 포함된 파일을 만듭니다.
for ((i=1; i<=10000000; i++)); do printf "%s " $RANDOM ; done > one.line
Perl은 이제 1,000단어마다 줄바꿈을 추가합니다.
time perl -pe '
s{
(?:\S+\s+){999} \S+ # 1000 words
\K # then reset start of match
\s+ # and the next bit of whitespace
}
{\n}gx # replace whitespace with newline
' one.line > many.line
타이밍
real 0m1.074s
user 0m0.996s
sys 0m0.076s
검증 결과
$ wc one.line many.line
0 10000000 56608931 one.line
10000 10000000 56608931 many.line
10000 20000000 113217862 total
승인된 awk 솔루션은 입력 파일에서 5초가 조금 넘게 걸렸습니다.
답변3
단어 정의가 공백으로 구분된 일련의 공백이 아닌 문자라고 가정하면 다음은 awk
단일 행 파일에 대한 솔루션 입니다.
awk '{for (i=1; i<=NF; ++i)printf "%s%s", $i, i % 500? " ": "\n"}i % 500{print ""}' file
답변4
일치시킬 단어 공간 패턴의 수를 지정하여 동일한 sed 명령을 단순화할 수 있습니다. 테스트할 큰 문자열 파일은 없지만 원본 스크립트에 루프가 없으면 프로세서가 데이터를 전송할 수 있는 만큼 빠르게 실행되어야 합니다. 추가 보너스는 여러 줄의 파일에서도 동일하게 작동한다는 것입니다.
n=500; sed -r "s/((\w+\s){$n})/\1\n/g" <input.txt >output.txt