Büyük tek satırlı dosyada temel sed komutu: belleği yeniden ayıramadı


10

250 MB'lık bir metin dosyam var, hepsi tek satırda.

Bu dosyada akarakterleri bkarakterlerle değiştirmek istiyorum :

sed -e "s/a/b/g" < one-line-250-mb.txt

Başarısız:

sed: couldn't re-allocate memory

Bana öyle geliyor ki, bu tür bir görev çok fazla bellek ayırmadan satır içinde gerçekleştirilebiliyor.
İş için daha iyi bir araç veya daha iyi bir kullanım yolu var sedmı?


GNU sed sürüm 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM



4
Bu soru çok karmaşık çok satırlı bir ifade ile ilgilidir. Benim sorum hayal edebileceğiniz en temel ifade hakkında.
Nicolas Raoul

@RubanSavvy plus, diğer Q'daki cevapların hiçbiri uzun çizgiyi dikkate almaz ve aslında her ikisinin de muhtemelen aynı sorunu olur.
terdon

Sed sürümünüzü bu Q'ya ve ayrıca donanım bilgilerinizi (özellikle RAM) ve dağıtım sürümünü ekleyebilir misiniz?
slm

Yanıtlar:


10

Evet, trbunun yerine şunu kullanın:

tr 'a' 'b' < file.txt > output.txt

sedbüyük bir çizgi sorunlara neden olacak şekilde çizgilerle ilgilenir. Satır tutmak için dahili bir değişken bildiriyor ve girdiniz bu değişkene ayrılan maksimum boyutu aşıyor.

tr diğer yandan karakterlerle ilgilenir ve keyfi olarak uzun satırları doğru bir şekilde işleyebilmelidir.


Merakla ben sadece "abcabc ..." w dolu bir 250MB dosya oluşturdu ve sed -e "s/a/z/g" b.txt > c.txtherhangi bir sorun olmadan yapabildi . Sed (GNU sed) kullanımı 4.2.2.
slm

@slm burada bir 496M dosyasında ve aynı sedsürümde aynıdır , sanırım uygulama veya donanıma bağlıdır.
terdon

Evet, daha eski bir versiyonuyla uğraştığımızı tahmin etmek zorunda kalsaydım sed.
slm

5

Sed ve awk'in tarihsel versiyonlarının hafıza problemleri vardı, bunlar çoğunlukla daha yeni versiyonlarda düzeltildi, ancak bu sorunun klasik oluşumlarından biri Larry Wall'u oldukça zorladı. Cevabı, donanım dışında bellek sınırı olmayan yeni bir programlama dili yazmaktı. Ona perl dedi. özel probleminiz daha basit bir şekilde çözülebilir, ancak kullandığım genel kural sed'in perl kullanmayacağı zamandır.

Düzenleme: istek üzerine bir örnek:

perl -pe "s/a/b/g" < one-line-250-mb.txt

veya daha az bellek kullanımı için:

perl -e 'BEGIN{$/=\32768}' -pe "s/a/b/g" < one-line-250-mb.txt

1
Bu paragrafın tamamı "Perl" e kadar kaynar. Bazı detaylar güzel olurdu, ya da en azından bir örnek ya da bir şey
Michael Mrozek

@MichaelMrozek Şapka koleksiyonunun roboeditinge yol açtığını fark ettim, ama itibarınızla biraz daha dikkat edeceğinizi düşündüm. Özellikle, belirli sorunun zaten çok dar bir şekilde çözülmüş olması, bu arama yapan insanların çoğuna yardımcı olmaz, bu yüzden genel durum için bir cevap ekledim. Sağladığım genişletilmiş cevap Nicolas Raoul'a yardımcı olacaktı. Zaten uygulanabilir bir çözüm olmasaydı, ama çok daha fazlasına yardımcı olacağından şüpheliyim, oysa orijinal cevabım sed sınırlarına ulaşan herkese yardımcı olacaktı. Kabul etmezseniz silerim
Aralık'ta

@hildred Cevaplarınıza geçerli yorumlar yaparken moderatörlere iyi niyet duyabileceğinizi sormak için çok fazla bir şey olduğunu sanmıyorum, hemen ön güdüler suçlamalarına başvurmadan (şapkalar, gerçekten ?!).
Chris Down

@ChrisDown Aksine - tamamen şapka içindeyim. Ayrıca bu, birden fazla kişi tarafından bir cevap olarak işaretlenmedi, ancak bu, şapkalara uzak ikinci bir öncelik
Michael Mrozek

Bellek sınırlaması ile ikincisi (2.5GB 1 satırlık dosyam için) hile yaptı: teşekkürler! sedGerçi biraz hayal kırıklığına uğrattı . : \
Tomislav Nakic-Alfirevic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.