The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Обработка строк текстового файла с целью разбивки на подстро..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Zizon email on 04-Сен-09, 18:39 
Смысл такой, есть файл где пишутся данные типа:
10.10.0.2       1025    255.255.255.255 1947    17      3       204     1252074605
10.10.0.2       1025    10.10.0.7       1947    17      3       204     1252074609
10.10.0.2       1025    255.255.255.255 1947    17      4       272     1252074720
10.10.0.2       1025    10.10.0.7       1947    17      3       204     1252074724
10.10.0.2       2284    10.10.0.1       3128    6       3       144     1252074802
10.10.0.1       3128    10.10.0.2       2284    6       3       120     1252074802
Необходимо обработать каждую строку, для получения отдельных подстрок, с последующим переносом в БД postgresql.
Представляю рабочий скрипт обработки текстового файла:

# BASH Shell Script
cat $1 | while read s
do
        echo $s
        str_num=0
        old_str_num=0
        string_length=${#s}
        while [ $str_num -lt $string_length ]
        do
                if [ -z ${s:str_num:1} ]
                then
                        str_length=`expr $str_num - $old_str_num`
                        echo ${s:old_str_num:str_length}
                        old_str_num=$str_num
                fi
                str_num=`expr $str_num + 1`
        done
        str_length=`expr $str_num - $old_str_num`
        echo ${s:old_str_num:str_length}
done
echo "ok"

Получившийся скрип работает правильно, но как всегда есть но, он очень медленно обрабатывает строки, что будет очень существенно, т.к. планируется обрабатывать большое количество строк.
Может есть у кого нибудь идеи как возможно оптимизировать данный скрипт, для увеличения процесса обработки текстового файла.
В Shell новичок, так что сильно не пинайте ;-)
Заранее очень благодарен за помощь и содействие ...

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Андрей (??) on 04-Сен-09, 19:14 
один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые строки, так что может быть не подойдёт
---
sed "s/ \+/\n/g" $1
echo "ok"
---
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от greenWar on 04-Окт-09, 12:27 
>один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые
>строки, так что может быть не подойдёт
>---
>sed "s/ \+/\n/g" $1
>echo "ok"
>---

что-то вот лично я не пойму, а что он конкретно делает?
$1 - подразумевается аргумент при запуске скрипта, тобишь название файла на обработку надо думать?
далее s/ \+/\n/g есть замена всех пробелов с плюсами (вы же заэкранировали тут плюс, поэтому это не означает от 1 до беск. пробелов) на перевод строки..
тобишь он задуман, как раскладыватель каждой строчки в столбик чтоли? но, поскольку + заэкранирован, работать не будет, т.к. там нет пробелов с плюсом
так чтоли?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Pahanivo email(ok) on 04-Сен-09, 19:16 
если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что уже само просто дебильное решение, даже хуже.
разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа insert можно тулзой awk в одну строку.
а это случаем не netflow?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от zizon email on 04-Сен-09, 20:09 
>если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что
>уже само просто дебильное решение, даже хуже.
>разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа
>insert можно тулзой awk в одну строку.
>а это случаем не netflow?

Нет, это не netflow, а ng_ipacct.

Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных переменных, с возможность записи последних в SQL базу PostgreSQL.

Так же подразумеваю что это возможно реализовать без использования выгрузки данных из ng_ipacct сразу же в SQL базу, но в связи с отсутствием знаний по Shell решил реализовать данный алгоритм таким способом.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Pahanivo email(??) on 04-Сен-09, 22:41 
>[оверквотинг удален]
>>а это случаем не netflow?
>
>Нет, это не netflow, а ng_ipacct.
>
>Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных
>переменных, с возможность записи последних в SQL базу PostgreSQL.
>
>Так же подразумеваю что это возможно реализовать без использования выгрузки данных из
>ng_ipacct сразу же в SQL базу, но в связи с отсутствием
>знаний по Shell решил реализовать данный алгоритм таким способом.

ты хоть маленько представляешь что делаешь??? похоже что ты даже не представляешь - либо задумайся либо меняй работу.
еще раз - разбор текста статистики ПОСИМВОЛЬНО ИНТЕРПРЕТАТОРМ есть тупость неимоверная.
уж если нужно перевести стороку вида
number1 number2 number3 ... numberN
в строку вида
number3 number5 number7
или
INSERT TO SOME_BASE.SOME_BASE VALUES (number3, number5, number7);
то надо быть полным ламером чтобы додуматься до подобного решения
еще раз для особо грамотных и умеющих читать ответа на свои дебильные посты
man awk, блин

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от zizon email on 05-Сен-09, 00:32 
Во первых про то кому менять работу или нет, я думаю не тебе решать, так что держи язык за зубами. А на счет того какого рода тупость данной идеи я не спрашивал, а попросил помощи разобраться, т.к. с Shell на данный момент знаком всего в течении уже как 8 часов.
А вот на счет ламерства я думаю ты глубоко погорячился, т.к. я представляю тебя с твоими то знаниями после 8 часов чтения о Shell скриптах грамотный ты наш со своими не дебильными постами.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от pavel_simple (ok) on 04-Сен-09, 19:22 
>[оверквотинг удален]
>done
>echo "ok"
>
>Получившийся скрип работает правильно, но как всегда есть но, он очень медленно
>обрабатывает строки, что будет очень существенно, т.к. планируется обрабатывать большое количество
>строк.
>Может есть у кого нибудь идеи как возможно оптимизировать данный скрипт, для
>увеличения процесса обработки текстового файла.
>В Shell новичок, так что сильно не пинайте ;-)
>Заранее очень благодарен за помощь и содействие ...

да уж...

sed/awk -- но главное -- что должно получиться? как должны выглядеть результирующие строки?

в скрипте разбираться влом.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от zizon email on 04-Сен-09, 20:17 
>если я правильно понял вы ПОСИМВОЛЬНО разбираете строки с интерпретаторе - что
>уже само просто дебильное решение, даже хуже.
>разобрать подобный текст (фикс кол-во колонок) с одновременным формирование sql запроса типа
>insert можно тулзой awk в одну строку.
>а это случаем не netflow?

Нет, это не netflow, а ng_ipacct.

Смысл данного скрипта задуман таким образом, чтобы получить строку в виде отдельных переменных, с возможность записи последних в SQL базу PostgreSQL.

Так же подразумеваю что это возможно реализовать без использования выгрузки данных из ng_ipacct сразу же в SQL базу, но в связи с отсутствием знаний по Shell решил реализовать данный алгоритм таким способом.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от vg (??) on 04-Сен-09, 21:21 
Забыть про шелл скрипт
Он не подходит для обработки большого количества текста

Perl или что-то другое

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от zizon email on 05-Сен-09, 02:49 
Всем огромное спасибо за подсказки. Данную проблемму разрешил, и как говорилось в самых первых постах решается все одной строкой:
cat $1 | awk '{print "INSERT INTO internet_trafik VALUES(\047"$1"\047,\047"$3"\047,\047"$5"\047,\047"$2"\047,\047"$4"\047,\047"$6"\047,\047"$7"\047,\047"$8"\047);"}' | /usr/local/bin/psql -U pgsql -d ng_ipacct

Интересен следующий момент, если реализовать данную выгрузку посредством PERL обработка будет гораздо быстрее? Или прироста не сильно будет заметно? Или же как всегда будет все зависеть от количества строк?

На всякий случай количество строк предполагается порядка 15000 ...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Андрей (??) on 05-Сен-09, 03:24 
>Всем огромное спасибо за подсказки. Данную проблемму разрешил, и как говорилось в
>самых первых постах решается все одной строкой:
>cat $1 | awk ...

cat $1 здесь совершенно лишний так как awk умеет сам читать из файла
awk '{...}' $1 будет делать тоже самое

>
>Интересен следующий момент, если реализовать данную выгрузку посредством PERL обработка будет гораздо
>быстрее? Или прироста не сильно будет заметно? Или же как всегда
>будет все зависеть от количества строк?
>
>На всякий случай количество строк предполагается порядка 15000 ...

врядли будет быстрее, но если вам интересно то попробуйте - это тоже одна строка на perl.
и если попробуете, то отпишите сюда, пожалуйста.

я сравнил ваш оригинальный скрипт на том примере что приведён вначале
real    0m0.945s
user    0m0.242s
sys    0m0.712s

и однострочник на sed
real    0m0.001s
user    0m0.000s
sys    0m0.001s

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от zizon email on 05-Сен-09, 03:45 
>[оверквотинг удален]
>
>я сравнил ваш оригинальный скрипт на том примере что приведён вначале
>real 0m0.945s
>user 0m0.242s
>sys 0m0.712s
>
>и однострочник на sed
>real 0m0.001s
>user 0m0.000s
>sys 0m0.001s

Если не затруднит, могли бы Вы выложить сюда реализацию данной проблеммы на sed?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от Andrey (??) on 05-Сен-09, 22:53 
>Если не затруднит, могли бы Вы выложить сюда реализацию данной проблеммы на
>sed?

так вот же он во втором коментарии лежит :-)
он не кладёт данные в БД он просто разбирает строку, так же как и ваш оригинальный скрипт.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "Обработка строк текстового файла с целью разбивки на подстро..."  +/
Сообщение от greenwar (ok) on 04-Окт-09, 12:29 
>один из вариантов оптимизации вашего скрипта, но этот вариант не печатает пустые
>строки, так что может быть не подойдёт
>---
>sed "s/ \+/\n/g" $1
>echo "ok"
>---

что-то вот лично я не пойму, а что он конкретно делает?
$1 - подразумевается аргумент при запуске скрипта, тобишь название файла на обработку надо думать?
далее s/ \+/\n/g есть замена всех пробелов с плюсами (вы же заэкранировали тут плюс, поэтому это не означает от 1 до беск. пробелов) на перевод строки..
тобишь он задуман, как раскладыватель каждой строчки в столбик чтоли? но, поскольку + заэкранирован, работать не будет, т.к. там нет пробелов с плюсом
так чтоли?

P.S. кстати, там в качестве разделителя походу табы вообще

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру