Terkait, tetapi tidak ada jawaban yang memuaskan: Bagaimana saya bisa membagi file teks besar menjadi potongan-potongan 500 kata atau lebih?
Saya mencoba untuk mengambil file teks ( http://mattmahoney.net/dc/text8.zip ) dengan> 10 ^ 7 kata semua dalam satu baris, dan membaginya menjadi baris dengan masing-masing N kata. Pendekatan saya saat ini berfungsi, tetapi cukup lambat dan jelek (menggunakan skrip 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
Adakah tips tentang cara membuat ini lebih cepat atau lebih ringkas?
text-processing
sed
awk
split
Cory Schillaci
sumber
sumber
Jawaban:
Dengan asumsi definisi kata Anda adalah urutan karakter non-kosong yang dipisahkan oleh kosong, berikut ini
awk
solusi untuk file baris tunggal Andasumber
Gunakan
xargs
(17 detik):Ia menggunakan
-n
benderaxargs
yang mendefinisikan jumlah argumen maksimal. Hanya mengubah1000
ke500
atau apa pun membatasi yang Anda inginkan.Saya membuat file uji dengan 10 ^ 7 kata:
Ini adalah statistik waktu:
sumber
xargs
- hatilah dengan perilaku pengupasan kutipann
lambat ini akan didapat, asal Anda tahu saja. Dengan-n10
saya membatalkannya setelah sekitar 8 menit menunggu ...Perl tampaknya cukup bagus dalam hal ini:
Buat file dengan 10.000.000 kata yang dipisahkan ruang
Sekarang, perl untuk menambahkan baris baru setelah setiap 1.000 kata
Pengaturan waktu
verifikasi hasil
Solusi awk yang diterima membutuhkan waktu lebih dari 5 detik pada file input saya.
sumber
Tidak benar-benar cocok ketika
N
banyak kata adalah angka besar tetapi jika itu adalah angka kecil (dan idealnya, tidak ada spasi awal / akhir di file satu baris Anda) ini harus cukup cepat (mis. 5 kata per baris):sumber
paste
string dengan cepat. Misalnya:tr -s '[[:blank:]]' '\n' < text8 | paste -d' ' $(perl -le 'print "- " x 1000')
set
dll ... dan bahkan kemudian, ada sejumlah argumen maks khusus sytem (saya tidak terbiasa dengan semua rasapaste
tapi Saya pikir dengan beberapa implementasi ada batasan untuk no. Args / file input dan / atau panjang jalur output ...)Perintah sed yang sama dapat disederhanakan dengan menentukan berapa banyak pola ruang kata yang ingin Anda cocokkan. Saya tidak punya file string besar untuk mengujinya, tetapi tanpa loop di skrip asli Anda ini harus berjalan secepat prosesor Anda dapat mengalirkan data. Manfaat tambahan, itu akan berfungsi sama baiknya pada file multi-line.
sumber
fmt(1)
Perintah yang dimuliakan , walaupun tidak sepenuhnya beroperasi pada "sejumlah kata tertentu" dapat dengan cepat membungkus garis panjang dengan tujuan (atau maksimum) lebar tertentu:Atau dengan perl modern, untuk jumlah kata tertentu, ucapkan, 10, dan anggap satu spasi sebagai batas kata:
sumber
pr
Perintah coreutils adalah kandidat lain: satu-satunya kerutan tampaknya adalah bahwa perlu untuk memaksa lebar halaman menjadi cukup besar untuk mengakomodasi lebar output.Menggunakan file yang dibuat menggunakan generator 10.000.000 kata @ Glenn_Jackman,
di mana penghitungan dikonfirmasi sebagai berikut
[Solusi perl Glenn masih sedikit lebih cepat, ~ 1.8s pada mesin ini].
sumber
di Go saya akan mencobanya seperti ini
sumber