'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ı.
'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ı.
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.
'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
öğ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. –
@ 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ı. –
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 $_;
}
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
@Jefromi Tamamen bilimsel olmayan testlerimde, 100 MB'lık bir dosyada chomp kullanmak yaklaşık 300 ms. –
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
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
tr sadece tek bir karakter alır – ghostdog74
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
:%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.
'perl -ne 'chomp; "$ _", "dosya" yazdırın. "-n" "döngüde varsayar" – ghostdog74
'-n' üzerinde iyi çağrı. – Cascabel
@sparrkey, "perl daha hızlı koşacak" bir gerekçe değil. – ghostdog74
$ 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
Sed komutunu test ettin mi? sed 'N; s/\ n /, /' dosya – sparkkkey
gerçekten değil. onun bir wiki kesmesi, ama sanırım wiki bazen güvenilir olamaz. – ghostdog74
En iyi araç sed ve onu aşağıdakilerle kullanabilirsiniz:! Komut
böylece, daha önce mevcut dosyanın
sed komutunu test ettin mi? – ghostdog74
evet – shingara
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