Как эффективно искать / заменять большой текстовый файл? - PullRequest
2 голосов
/ 23 августа 2010

У меня относительно большой файл данных в формате csv / text (33 МБ), который мне нужен для глобального поиска и замены символа-разделителя. (Причина в том, что, похоже, нет способа заставить SQLServer экранировать / обрабатывать двойные кавычки в данных во время экспорта таблицы, но это другая история ...)

Я успешно выполнил поиск Textmate и заменил его на файл меньшего размера, но он захлебнулся этим большим файлом.

Кажется, что командная строка grep может быть ответом, но я не совсем понимаю синтаксис, ала:

grep -rl OLDSTRING . | xargs perl -pi~ -e ‘s/OLDSTRING/NEWSTRING/’

Так что в моем случае я ищу символ '^' (символ вставки) и заменяю его символом "" (двойная кавычка).

grep -rl " grep_test.txt | xargs perl -pi~ -e 's/"/^'

Это не работает, и я предполагаю, что это связано с выходом из двойной кавычки или чего-то еще, но я довольно потерян. Кому-нибудь помочь?

(Полагаю, если кто-нибудь знает, как заставить SQLServer2005 обрабатывать двойные кавычки в текстовом столбце во время экспорта в csv, это действительно решило бы проблему ядра).

Ответы [ 2 ]

3 голосов
/ 23 августа 2010

Ваша замена perl кажется неправильной.Попробуйте:

grep -rl \" . | xargs perl -pi~ -e 's/\^/"/g'

Объяснение:

grep : command to find matches
-r : to recursively search
-l : to print only the file names where match is found
\" : we need to escape " as its a shell meta char
. : do the search in current working dir
perl : used here to do the inplace replacement
-i~ : to do the replacement inplace and create a backup file with extension ~
-p : to print each line after replacement
-e : one line program
\^ : we need to escape caret as its a regex meta char to mean start anchor
2 голосов
/ 24 августа 2010
sed -i.bak 's/\^/"/g' mylargefile.csv

Обновление: вы также можете использовать Perl, как подсказал Повин

perl -i.bak -pe 's/\^/"/g' mylargefile.csv

Но на больших файлах sed может работать немного быстрее, чем Perl, как показывает мой результат на 6-миллионном строчном файле

$ tail -4 file
this is a line with ^
this is a line with ^
this is a line with ^

$ wc -l<file
6136650

$ time sed 's/\^/"/g' file  >/dev/null

real    0m14.210s
user    0m12.986s
sys     0m0.323s
$ time perl  -pe 's/\^/"/g' file >/dev/null

real    0m23.993s
user    0m22.608s
sys     0m0.630s
$ time sed 's/\^/"/g' file  >/dev/null

real    0m13.598s
user    0m12.680s
sys     0m0.362s

$ time perl  -pe 's/\^/"/g' file >/dev/null

real    0m23.690s
user    0m22.502s
sys     0m0.393s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...