Text-Processing
將文本文件拆分為具有固定字數的行
相關但沒有令人滿意的答案:如何將大型文本文件拆分為 500 字左右的塊?
我正在嘗試獲取一個文本文件(http://mattmahoney.net/dc/text8.zip),其中 > 10^7 個單詞全部放在一行中,並將其拆分為每行包含 N 個單詞的行。我目前的方法有效,但相當緩慢且醜陋(使用 shell 腳本):
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
關於如何使這更快或更緊湊的任何提示?
使用
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
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 秒多一點。