LINUX.ORG.RU

Интересно, замена массива данных в тексте....


0

0

Всем привет!

Вчера спрашивал про замену в большом текстовом файле , на . Сделал используя tr... Супер... Удивился как все быстро заменяется... И стало интересно, придумал себе задачку.

Есть файл текстовый. Хранит данные например проводки бухгалтерии.... Код счета 1, Код счета 2, Дата и так далее

Файл скажем весит метров 100.

Хочу посмотреть как быстро будет выполняться замена. Задача которую придумал: надо заменить Код счета1,2 на другой по таблице соответствия. Создал файл где указан старый счет и его соответствие новому счету. 1010 1873246 2010 239847 и т.д.

Как tr применить? Или в данном случае не его применять? Хочу оценить скорость обработки.... Потому как я помню даввнооо такое коллеги делали и делали долго в екселе.

Спс!

Re: Интересно, замена массива данных в тексте....

вариант "в лоб":

скрипт на баше, читает файл с заменами построчно, скармливает каждую строку в tr.

nu11 ★★★★★ ()

Re: Интересно, замена массива данных в тексте....

так получается можно на вход tr подать файл с заменами? а как он должен быть отформатрирован? man tr - не вижу чтобы на вход файл с заменами можно подать.

slackman ()

Re: Интересно, замена массива данных в тексте....

Если не ошибаюсь, tr заменяет один 1-байтный символ на другой, либо удаляет заданные 1-байтные символы. Для замены слова на слово, или если есть UTF, быстрее всего sed 's/что заменять/на что заменять/g'.

Если есть файл с таблицей замен, я бы его тоже sed-ом преобразовал в bash-скрипт, который делал бы нужные замены, вызывая sed.

question4 ★★★★★ ()

Re: Интересно, замена массива данных в тексте....

оооо идея.... )))) допустим файл соответствии soot.txt хранит в себе 1232 - 38423 1212 - 20938 (по идее должно быть много таких соответствии в файле)

тогда как 1232 надо заменить на 38423 в файле (большом допустим, создам для примера у себя) file.txt.

тогда остается дописать в файл soot.txt вроде типа этого? sed 's/1232/38423/g' < file.txt > new_file.txt

Правильно ли? )))) Понимаю что появится следующая проблема добавления таких знаков в файл soot.txt

slackman ()

Re: Интересно, замена массива данных в тексте....

> Правильно ли? )))) Понимаю что появится следующая проблема добавления таких знаков в файл soot.txt

Да. Только с использованием < и > при многократных заменах сложно разбираться, проще скопировать file.txt в new_file.txt и редактировать его: -i filetoedit.txt

Если файл замен имеет вид:

1232 - 38423
1212 - 20938

где первое число — старый номер, 2-е — новый, число пробелов произвольное, дефис один; подойдёт команда:

sed 's/^ */sed '\''s\// ; s/ *- */\// ; s/ *$/\/g'\'' -i filetoedit.txt/' < file.txt > script.sh

Полученный скрипт можно запустить командой

bash script.sh

Другой вариант: преобразовать не в bash-скрипт, а в скрипт для самого sed-а:

sed 's/^ */s\// ; s/ *- */\// ; s/ *$/\/g/' < file.txt > sedscript

Его надо вызывать командой

sed -f sedscript -i filetoedit.txt

Пожалуй, 2-ой способ проще, но мне привычнее 1-й.

Как работает объяснить?

Вообще man sed и примеры на http://sed.sourceforge.net/

question4 ★★★★★ ()

Re: Интересно, замена массива данных в тексте....

> Да. Только с использованием < и > при многократных заменах сложно разбираться, проще скопировать file.txt в new_file.txt и редактировать его: -i filetoedit.txt

То есть я имел в виду "скопировать file.txt в filetoedit.txt"

question4 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.