Как заменить окончания строки в VIM

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

:%s/\n/, /g

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

8
задан Frankovskyi Bogdan 4 March 2010 в 14:37
поделиться

6 ответов

Итак, я просмотрел и протестировал / рассчитал некоторые ответы, которые были даны другими людьми, плюс собственный ответ на языке 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.

8
ответ дан 5 December 2019 в 12:57
поделиться
$ 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
{{ 1}}
0
ответ дан 5 December 2019 в 12:57
поделиться

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

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

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

tr "\n" "," < input_file > output_file
0
ответ дан 5 December 2019 в 12:57
поделиться

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

#!/usr/local/bin/perl

while (<>) {
  $_ =~ s/\n/,/g;
  print $_;
}
2
ответ дан 5 December 2019 в 12:57
поделиться

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

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

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

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

3
ответ дан 5 December 2019 в 12:57
поделиться

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

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

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

0
ответ дан 5 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: