Saya memiliki file teks 250 MB, semuanya dalam satu baris.
Dalam file ini saya ingin mengganti a
karakter dengan b
karakter:
sed -e "s/a/b/g" < one-line-250-mb.txt
Gagal dengan:
sed: couldn't re-allocate memory
Tampak bagi saya bahwa tugas semacam ini dapat dilakukan inline tanpa mengalokasikan banyak memori.
Apakah ada alat yang lebih baik untuk pekerjaan itu, atau cara yang lebih baik untuk digunakan sed
?
GNU sed versi 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
sumber
sumber
Jawaban:
Ya, gunakan
tr
saja:sed
berurusan dalam garis sehingga garis besar akan menyebabkan masalah. Saya berharap itu mendeklarasikan variabel internal untuk menahan garis dan input Anda melebihi ukuran maksimum yang dialokasikan untuk variabel itu.tr
di sisi lain berurusan dengan karakter dan harus dapat menangani garis panjang yang sewenang-wenang dengan benar.sumber
sed -e "s/a/z/g" b.txt > c.txt
tanpa masalah. Menggunakan sed (GNU sed) 4.2.2.sed
versi yang sama , kira itu tergantung pada implementasi atau perangkat keras.sed
.Versi historis sed dan awk memiliki masalah memori, ini sebagian besar telah diperbaiki di versi yang lebih baru, tetapi salah satu kejadian klasik dari masalah ini mengenai Larry Wall cukup keras. jawabannya adalah menulis bahasa pemrograman baru - tanpa batas memori selain perangkat keras. Dia menyebutnya perl. masalah spesifik Anda dapat diselesaikan lebih sederhana, tetapi aturan umum yang saya gunakan adalah ketika sed tidak akan menggunakan perl.
Edit: dengan meminta contoh:
atau untuk penggunaan memori lebih sedikit:
sumber
sed
, meskipun. : \