Возникла необходимость изменения некоторых параметров в файле большого размера (дамп базы данных больше трех гигабайт). Редакторы отпадают (слишком тяжело им "ворочать" таким обьемом данных), но для интереса попробовал с помощью таких редакторов:
Для решения подобной задачи все таки лучше использовать другие способы. Итак, исходные данные:
# cat example.txt I have two powerfull laptops. |
Заменим строку "laptops" на "servers" несколькими способами.
Способ 1. Замена подстроки в одном файле с помощью sed
# sed -e 's/laptops/servers/g' example.txt > example_new.txt I have two powerfull servers. |
Способ 2. Замена подстроки в одном файле с помощью perl
# perl -e 's/laptops/servers/g' -pi example.txt |
Способ 3. Замена подстроки с помощью awk
# awk '{gsub("laptops", "servers", $0); print > FILENAME}' example.txt |
Теперь отсортируем выводы по ресурсоемкости операций (использовалась утилита time, замена использовалась для файла размером 2.3GB)
Способ 1
10.915u 9.029s 2:35.01 12.8% 37+1490k 14962+18828io 0pf+0w |
Способ 2
7.445u 9.400s 2:52.98 9.7% 5+1503k 19574+18828io 0pf+0w |
Способ 3
0.000u 0.077s 0:00.42 16.6% 154+1332k 9+0io 9pf+0w |
Информация для размышлений предоставлена, а необходимый результат достигнут.
Re: Примеры замены текста в файлах
Как-то странно, обычно sed работает намного быстрее, чем awk и тем более perl. А результаты говорят обратное
Re: Примеры замены текста в файлах
У себя пробовали провести тестирование? Какие результаты?
Re: Примеры замены текста в файлах
У меня awk "урезает" исходный файл до 4097 байт!
Есть идеи по поводу причин такого странного поведения?
cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@web-linux backup]# awk --version
GNU Awk 3.1.7
Re: Примеры замены текста в файлах
вместо:
# awk '{gsub("laptops", "servers", $0); print > FILENAME}' example.txt
сделать так:
# awk -i inplace '{gsub("laptops", "servers", $0)} 1' example.txt
Re: Примеры замены текста в файлах
а если перед запуском кеш почистить? echo 3 > /proc/sys/vm/drop_caches