VIM

2010-03-04 48 views
8

'daki satır sonları nasıl değiştirilir? Tüm satır sonlarını büyük dosyada nasıl değiştirebilirim (> 100MB)? BenVIM

:%s/\n/, /g

yapmaya çalıştık ama çok yavaş olması.

+0

Bunu neden VIM'de yapmak istiyorsunuz. Sadece okuyamayacağınız uzun bir çizgi ile sonlanacaksınız (gözlerle). Ayrıca, hangi satır sonları var: DOS, UNIX, MAC veya bir kombinasyon? – Marichyasana

cevap

8

Yani, geçti ve test edilmiş/diğer insanlar tarafından verildi cevapların bir kısmını zamanlanmış entegre değişikliği ile bir tmp dosyası oluşturmak gerek :!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'

kullanmak artı benim bir python cevabı. İşte ne var:

tr:

> time tr "\n" "," <lines> line 
real 0m1.617s 
user 0m0.100s 
sys  0m1.520s 

piton:

> time python -c 'import sys; print sys.stdin.read().replace("\n",", "),' <lines> line 
real 0m1.663s 
user 0m0.060s 
sys  0m1.610s 

awk:

> time awk '{printf("%s, ", $0)}' lines > line         
real 0m1.998s 
user 0m0.390s 
sys  0m1.600s 

perl: sed

> time perl -e 'while (<>) { chomp; print "$_, " }' lines > line 
real 0m2.100s 
user 0m0.590s 
sys  0m1.510s 

: Burada

> time sed 's/$/, /g' lines > line            
real 0m6.673s 
user 0m5.050s 
sys  0m1.630s 

kullandığım dosyasıdır: Başlangıçta cygwin alındı ​​zamanlamaları

> ls -lh lines 
-rw-r--r-- 1 some one 101M 2010-03-04 19:54 lines 
> wc -l < lines 
1300000 
> head -n 3 < lines 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched. 
> head -n 1 < lines | wc -c 
82 

, artık birlikte atılmıştır tamamen güncellenmiş ubuntu 9.10. Ayrıca, metin dosyaları boyutu 80ish karakter genişliğinde, 100 mega artırıldı. Sed'den başka bir şey görebileceğiniz gibi iyi bir fikir.

+2

'dan önce test ediyorum, awk sonuçlarından çok şüpheliyim. Zaman sadece birkaç kez değil, birkaç kez komut veriyor. Python, modüller ve – ghostdog74

+0

öğelerini içe aktarmanın zaman alacağı düşünülürse awk'den daha hızlı olmamalıdır. Sadece her seferinde yaklaşık 10 kez, 1.7xx koştu. Cygwin awk kullanmıyorsam belki farklı olurdu. –

+0

@ ghostdog74 Awk sonuçlarından şüphelenmek için haklıydınız, gerçek bir linux kutusuna tekrar koştum ve çok daha hızlıydı. –

2

Dosyanızdan gitmek için bu Perl komut dosyasını kullanın; VIM ile her şeyi hafızada tutmaktan daha hızlı olurdu. Sadece yeni bir dosyaya boru çıkışı.

#!/usr/local/bin/perl 

while (<>) { 
    $_ =~ s/\n/,/g; 
    print $_; 
} 
+0

Perl yorumlayıcısının, bu durumda '$ _' son karakteri dışında yeni bir satır olamayacağını bilecek kadar akıllı olduğunu tahmin ediyorum - 'chomp' muhtemelen çok daha hızlı. – Cascabel

+0

@Jefromi Tamamen bilimsel olmayan testlerimde, 100 MB'lık bir dosyada chomp kullanmak yaklaşık 300 ms. –

0

Bunu vim içinde yapmak zorunda mısın?

Karakter tabanlı çeviri yapan güzel Unix yardımcı programı var. Bu tr denir. Bazı reference. Senin durumunda

olurdu: Bir :1,$j ardından

 
tr "\n" "," < input_file > output_file 
+0

Bu, gönderdiğim çözümlerden neredeyse kesinlikle daha hızlıdır, ancak maalesef OP'nin talep ettiği gibi "," yerine "," yerine geçmektedir. Bunu yapmak için bir yolun olduğundan emin değilim, orada mı? – Cascabel

+0

tr sadece tek bir karakter alır – ghostdog74

+0

Hayır yok, oradaki alanı fark etmedim. 1'den fazla karakter koymak için, biri aşağıda yayınlanan biri olarak sed kullanabilir. – pajton

3

:%s/$/, / daha hızlı olabilir. Aksi takdirde, bir harici yardımcı programında bunu:

perl -e 'while (<>) { chomp; print "$_, " }' input_file > output_file 

awk '{printf("%s, ", $0)}' input_file > output_file 

en hızlı olacaktır kafamın üst kapalı bilmiyorum.

+0

'perl -ne 'chomp; "$ _", "dosya" yazdırın. "-n" "döngüde varsayar" – ghostdog74

+0

'-n' üzerinde iyi çağrı. – Cascabel

+0

@sparrkey, "perl daha hızlı koşacak" bir gerekçe değil. – ghostdog74

0
$ more file 
aaaa 
bbbb 
cccc 
dddd 
eeee 

$ awk 'NR>1{printf("%s, ", p)}{p=$0}END{print p}' file 
aaaa, bbbb, cccc, dddd, eeee 

$ sed -e :b -e '$!N;s/\n/, /;tb' file 
+0

Sed komutunu test ettin mi? sed 'N; s/\ n /, /' dosya – sparkkkey

+0

gerçekten değil. onun bir wiki kesmesi, ama sanırım wiki bazen güvenilir olamaz. – ghostdog74

0

En iyi araç sed ve onu aşağıdakilerle kullanabilirsiniz:! Komut

böylece, daha önce mevcut dosyanın

+0

sed komutunu test ettin mi? – ghostdog74

+0

evet – shingara