Saya memiliki file teks 25GB yang perlu diganti string hanya pada beberapa baris. Saya dapat menggunakan dengan sed
sukses tetapi butuh waktu sangat lama untuk dijalankan.
sed -i 's|old text|new text|g' gigantic_file.sql
Apakah ada cara yang lebih cepat untuk melakukan ini?
sed
replace
large-files
Eisaacson
sumber
sumber
Jawaban:
Anda dapat mencoba:
Dari referensi ini :
Berikut ini perbandingan file 10G. Sebelum:
Setelah:
sumber
sed
salah eja. Saya mengedit posting ini kemarin untuk memperbaikised
perintah terakhir yang seharusnyatime sed -i '/original/ s//ketan/g' wiki10gb
dan tidaktime sed -i '/ketan/ s//original/g' wiki10gb
. Saya mengembalikan hasil edit saya hari ini karena 1. kali tidak lagi cocok dengan perintah dan 2. Saya telah melakukan tes yang sama dengan GNU pada file 3+ GB dan saya tidak melihat perbedaan antara duased
alternatif. Saya menduga bahwa perbedaan waktu adalah karena kesalahan ejaan.time
hasil secara pribadi, tetapi secara keseluruhan, tidak ada perbedaan waktu.Jawaban singkatnya adalah "Tidak" - faktor pembatas Anda pada operasi semacam ini adalah disk IO. Tidak ada cara untuk streaming 25GB disk lebih cepat. Anda mungkin mendapatkan sedikit peningkatan jika Anda tidak mengedit di tempat, dan Anda menulis hasil dari
sed
ke drive yang terpisah (jika Anda memiliki satu tersedia) - karena dengan cara itu Anda dapat membaca dari satu, sementara menulis ke yang lain dan ada sedikit lebih sedikit pertengkaran sebagai hasilnya.Anda mungkin dapat mempercepatnya sedikit dengan tidak menggunakan mesin regex untuk setiap baris - jadi misalnya menggunakan perl (Saya cukup yakin Anda bisa melakukan ini dengan
sed
tetapi saya tidak tahu sintaks) - ini akan mulai dari baris 10.000 dan seterusnya.Dan jika ada semacam komplikasi dalam RE (metacharacters) maka meminimalkan itu akan sedikit meningkatkan efisiensi mesin regex.
sumber
sed -i '10000,$ s/old_text/new_text/g'
sed
membandingkan - saya menganggap sedikit lebih cepat, tetapi tidak banyak karena ukuran file.sed
diperl
, tetapi yang terakhir juga memungkinkan Anda menulis lebih verbose script juga.Jika teks baru dan lama memiliki panjang yang sama, Anda dapat mencari ke dalam file dan hanya menulis byte yang diubah, alih-alih menyalin seluruh file. Kalau tidak, Anda terjebak dalam memindahkan banyak data.
Catatan: ini rumit dan melibatkan penulisan kode khusus.
Lihat halaman manual untuk fseek jika Anda bekerja di C atau C ++, atau pembungkus bahasa yang Anda sukai untuk mencari dan menulis panggilan sistem.
Jika Anda bersikeras menggunakan baris perintah saja, dan Anda bisa mendapatkan byte offset teks, Anda dapat menulis teks pengganti di tempat dengan perintah "dd" yang ditulis dengan hati-hati.
sumber