Как я могу заменить все окончания строки в большом файле (> 100 МБ)? Я попытался сделать
:%s/\n/, /g
но это слишком медленно.
Итак, я просмотрел и протестировал / рассчитал некоторые ответы, которые были даны другими людьми, плюс собственный ответ на языке 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.
$ 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}} Вы должны делать это в vim?
Есть хорошая утилита Unix, которая выполняет перевод на основе символов. Он называется tr
.
Некоторая ссылка .
В вашем случае это будет:
tr "\n" "," < input_file > output_file
Используйте этот сценарий Perl для просмотра вашего файла; это будет быстрее, чем хранить все в памяти с помощью VIM. Просто перенаправьте вывод в новый файл.
#!/usr/local/bin/perl
while (<>) {
$_ =~ s/\n/,/g;
print $_;
}
:% s / $ /, /
, за которым следует : 1, $ j
может быть быстрее. В противном случае сделайте это во внешней утилите:
perl -e 'while (<>) { chomp; print "$_, " }' input_file > output_file
awk '{printf("%s, ", $0)}' input_file > output_file
Не знаю, что было бы быстрее всего.
Лучший инструмент - sed, и вы можете использовать его с помощью команды :!
так что используйте :!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'
Вам нужно создать файл tmp с изменениями, прежде чем интегрировать их в ваш текущий файл