Как заменить окончания строк в VIM - PullRequest
8 голосов
/ 04 марта 2010

Как заменить все окончания строк в большом файле (> 100 МБ)? Я пытался сделать

:%s/\n/, /g

но это слишком медленно.

Ответы [ 6 ]

8 голосов
/ 05 марта 2010

Итак, я прошел и протестировал / рассчитал некоторые ответы, которые были даны другими людьми, плюс мой собственный ответ на python.Вот что я получил:

tr:

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

python:

> 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:

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

sed:

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

Вотфайл, который я использовал:

> 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

Первоначально тайминги были взяты в Cygwin, теперь они взяты с полностью обновленной Ubuntu 9.10.Кроме того, размер текстовых файлов был увеличен до 100 мегабайт, ширина строк - 80 символов.Как вы можете видеть, почти все, кроме sed - хорошая идея.

3 голосов
/ 04 марта 2010

:%s/$/, / с последующим :1,$j может быть быстрее. В противном случае сделайте это во внешней утилите:

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

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

Не знаю, что было бы быстрее всего.

2 голосов
/ 04 марта 2010

Используйте этот Perl-скрипт для просмотра вашего файла;это было бы быстрее, чем хранить все в памяти с VIM.Просто передайте вывод в новый файл.

#!/usr/local/bin/perl

while (<>) {
  $_ =~ s/\n/,/g;
  print $_;
}
0 голосов
/ 04 марта 2010

Лучший инструмент - sed, и вы можете использовать его с:!команда

, поэтому используйте :!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'

Вам необходимо создать файл tmp с изменением, прежде чем интегрировать в ваш текущий файл

0 голосов
/ 04 марта 2010
$ 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 голосов
/ 04 марта 2010

Вы должны сделать это в vim?

Есть хорошая утилита Unix, которая делает перевод на основе символов Это называется tr. Некоторые ссылка .

В вашем случае это будет:

tr "\n" "," &lt input_file &gt output_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...